高级语言在测控中的应用Word文档格式.docx
《高级语言在测控中的应用Word文档格式.docx》由会员分享,可在线阅读,更多相关《高级语言在测控中的应用Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
通过【发送】按钮对应函数OnButtonManualsend()来实现。
发送数据时,程序仅需要读出发送编辑框的内容,将其转化为发送程序需要的数据格式后,再使用C语言中的强制类型转换功能,将其转换为ColeVariant数据类型,由MSComm类的SetOutput()函数送入发送缓冲区即可。
2.3接收功能
当MSComm的接收缓冲区有字符时,程序会发送事件消息,OnOnCommMscomm1()函数响应该消息并进行处理,由于MSComm类GetInput()函数返回的数据变量类型为Variant型,而编辑框对应的显示字符串是Cstring型,因此接收数据时,需要先进行类型转换。
在VC中,转换过程如下:
将Variant类型转换为ColeSafeArray类型;
将ColeSafeArray类型转换为BYTE类型数组;
将BYTE类型数组转换为Cstring变量。
2.4发送、接收计数并显示功能
通过【发送:
】【接收:
】按钮(属性中样式选为:
浮动)实现显示发送接收计数显示。
2.5清除显示功能
分别通过【清空显示】【清空显示】【清空计数】按钮将发送区、接收区、计数显示清空。
2.6退出程序功能
通过【退出】按钮实现退出程序的功能。
3程序运行平台
VC++6.0、串口调试助手V2.1、VSPM虚拟串口
具体操作如下:
3.1创建基于对话框的MFC应用程序
打开vc++6.0文件---新建---工程(选择MFCAppWizard[exe])工程名:
tudanmscomm;
选择文件保存位置---确定----选基本对话框---下一步---下一步(默认设置)-----下一步(默认设置)---选择CmyDlg---完成---确定。
3.2在当前的Workspace中插入MSComm控件
在设置项目选项时必须选上ActiveXControls,其他的按照缺省设置。
然后进行
3.3其他控件添加
根据自己的设计,将相应的控件添加到对话框中,并修改属性以及相应的添加变量。
设计好的对话框如下图所示:
3.4程序编辑
根据设计要求内容编辑程序,并通过反复的调试、编译、连接、执行,完成设计要求,并运行成功,能够实现各个功能要求。
4总体设计
图4.1系统总体框架图
5程序类的说明
∙CMSCommDlg类的声明
voclassCMSommDlg:
publicCDialog
{
//Construction
public:
CMSCommDlg(CWnd*pParent=NULL);
//standardconstructor
//DialogData
//{{AFX_DATA(CMSCommDlg)
enum{IDD=IDD_MSCOMM_DIALOG};
//各个控件对应控件ID的变量类型以及对应的变量名
CButtonm_recvcount;
CButtonm_sendcount;
CButtonm_comclose;
CButtonm_comopen;
CMSCommm_mscomm;
CStringm_str_send;
CStringm_str_recv;
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CMSCommDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);
//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
HICONm_hIcon;
//Generatedmessagemapfunctions
//{{AFX_MSG(CTudanmscommDlg)
virtualBOOLOnInitDialog();
afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam);
afx_msgvoidOnPaint();
afx_msgHCURSOROnQueryDragIcon();
afx_msgvoidOnCleandata1();
//清除接收区显示
afx_msgvoidOnCleancounter();
//清除发送、接收计数
afx_msgvoidOnQuit();
//退出程序
afx_msgvoidOnClosecom();
//关闭串口
afx_msgvoidOnOnCommMscomm1();
//接收缓冲区响应函数
afx_msgvoidOnSenddata();
//数据发送
afx_msgvoidOnCleandata2();
//清除发送区显示
afx_msgvoidOnOpencom();
//打开串口
afx_msgvoidOnRadio1();
//串口选择COM1
afx_msgvoidOnRadio2();
//串口选择COM2
afx_msgvoidOnRadio3();
//串口选择COM3
afx_msgvoidOnRadio4();
//串口选择COM4
DECLARE_EVENTSINK_MAP()
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
6模块分析
6.1初始化模块
m_mscomm.SetCommPort
(1);
//选择COM1
//波特率9600,无校验,8个数据位,1个停止位
m_mscomm.SetInputMode
(1);
//输入方式为二进制方式
m_mscomm.SetInBufferSize(1024);
//设置输入缓冲区大小
m_mscomm.SetOutBufferSize(512);
//设置输chu缓冲区大小
//设置波特率9600,无校验,8个数据位,1个停止位
m_mscomm.SetSettings("
9600,N,8,1"
);
if(!
m_mscomm.GetPortOpen())
m_mscomm.SetRThreshold
(1);
//参数1表示每当串口接收缓冲区中有多于或等于一个字符时将引发一个接收数据oncomm事件
m_mscomm.SetInputLen(0);
//设置当前接受区数据长度为0
m_mscomm.GetInput();
//先预读缓冲区以清除残余数据
m_comopen.EnableWindow(false);
//打开串口按钮无效
m_comclose.EnableWindow(true);
//关闭串口按钮有效
6.2串口选择模块
单选按钮实现串口选择:
voidCMSCommDlg:
:
OnRadio1()
radionumber=1;
if(m_mscomm.GetPortOpen())
{
m_mscomm.SetPortOpen(false);
//关闭串口
m_comopen.EnableWindow(true);
//打开串口按钮有效
m_comclose.EnableWindow(false);
//关闭串口按钮失效
}
m_mscomm.SetCommPort(radionumber);
//选择相应的COM1
m_mscomm.SetPortOpen(true);
m_comopen.EnableWindow(false);
m_comclose.EnableWindow(true);
}
OnRadio2()
//TODO:
Addyourcontrolnotificationhandlercodehere
radionumber=2;
//选择相应的COM2
OnRadio3()
radionumber=3;
//选择相应的COM3
//关闭串口按钮失效
OnRadio4()
radionumber=4;
//选择相应的COM4
}……
6.3发送数据、发送计数显示模块
通过触发【发送按钮】实现发送数据:
voidCTudanmscommDlg:
OnButtonManualsend()
UpdateData(TRUE);
//读取编辑框内容
m_ctrlComm.SetOutput(COleVariant(m_strEditTXData));
//发送数据
TX_count+=m_strEditTXData.GetLength();
//发送计数
CStringstrTemp;
strTemp.Format("
发送:
%d"
TX_count);
m_ctrlTXCount.SetWindowText(strTemp);
//显示计数
6.4数据接收、接收计数显示模块
OnOnCommMscomm1()
VARIANTvariant_inp;
COleSafeArraysafearray_inp;
LONGlen,k;
BYTErxdata[2048];
//设置BYTE数组
CStringstrtemp;
if(m_ctrlComm.GetCommEvent()==2)//事件值为2表示接受缓冲区内有字符
variant_inp=m_ctrlComm.GetInput();
//读缓冲区
safearray_inp=variant_inp;
//VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize();
//得到有效数据长度
for(k=0;
k<
len;
k++)
safearray_inp.GetElement(&
k,rxdata+k);
//转换为BYTE型数组
k++)//将数组转换为Cstring型变量
{
BYTEbt=*(char*)(rxdata+k);
//字符型
strtemp.Format("
%c"
bt);
//将字符送入临时变量strtemp存放
m_strEditRXData+=strtemp;
//加入接受编辑框对应字符串
rxdatacount+=len;
//m_ctrlRXCount.SetWindowText("
接受:
"
+rxdatacount);
CStringtemp;
temp.Format("
%ld"
rxdatacount);
temp="
+temp;
m_ctrlRXCount.SetWindowText(temp);
//显示接受计数
}
UpdateData(false);
//修改为空
6.5清空模块
//接收区显示清空
OnCleandata1()
m_str_recv.Empty();
//退出程序
OnQuit()
CDialog:
OnOK();
//发送区显示清空
OnCleandata2()
m_str_send.Empty();
//计数显示清空
OnCleancounter()
recvcount=0;
sendcount=0;
m_sendcount.SetWindowText("
0"
m_recvcount.SetWindowText("
接收:
}
6.6打开串口、关闭串口、退出程序模块
OnOpencom()
m_mscomm.SetPortOpen(true);
m_comopen.EnableWindow(false);
//打开串口按钮失效
m_comclose.EnableWindow(true);
}
}//关闭串口
OnClosecom()
m_mscomm.SetPortOpen(false);
m_comopen.EnableWindow(true);
m_comclose.EnableWindow(false);
//TODO:
CDialog:
7系统测试
首先进入VC++6.0,打开工程MSComm.dsw,然后进入源程序,接着选择Build下的ExecuteMSComm.exe即可,也可以不打开工程,直接双击MSComm文件夹下的debug或release子文件夹下的MSComm.exe文件即可运行程序。
调试如下:
(1)、打开VSPM虚拟串口并新增虚拟串口:
(图7-1)
图7-1
(2)、打开串口调试助手V2.1、并选择虚拟串口COM3:
(图7-2)
图7-2
(3)、打开vc++6.0,运行自己设计的程序、并选择串口COM4(图7-3)
(图7-3)
(4)、分别在串口调试助手V2.1和自己的程序发送区输入内容,再点【发送】按钮,观察各个文本框的内容是否正确:
(图7-4)
(图7-5)
(5)、点击【清除显示】、【清除显示】、【清除计数】分别将文本框、发送和计数显示清除:
(图7-5)
(6)、测试成功程序能够完成串口通讯功能。
点击【退出】按钮退出程序。
8结论
本次课程设计是利用VC++下的MSComm控件编程方法,通过MSComm控件可以十分便捷地写出灵活性高,移植性强的串口通信程序,避免了去了解一些复杂的windowsAPI函数。
这种方法具有很强的实用性,可以广泛地用于工业数据采集等领域。
课程设计头几天因为考试,耽误了时间。
之后明显感觉到时间的不够,之初需要熟悉题目,明确mscomm控件下主要函数所实现的功能属性。
熟悉vc++环境下对话框编辑以及各个控件的添加,变量的设置。
本次设计用的主要是类的使用类的继承。
在编辑过程中出现很多错误,在不断的调试、编译、链接过程中也闹出了喝多笑话。
在本次设计中是在VC++下用MSComm控件实现简单的串口通讯。
本次设计不足之处在于串口的设置中:
波特率、检验位、数据位、停止位都可选择,而是系统初始化中实现。
还有就是在串口选择中通过单选按钮实现代码过于繁多。
在发送数据时不能发送汉字。
通过本次课程设计,初步的了解VC++和mscomm控件的编写思想,在程序的编写过程中,了解了以前没有学到的一些东西,加深了对类,全局变量,局部变量的理解。
对于在vc++环境下开发程序的过程步骤有了初步了解。
就单本次课程设计而言,其设计的C++内容并不是很多,其编程的某些思想与我与VB有类似之处。
就本次设计所设计到的内容只能说是C++的冰山一角。
如果以后要想运用的熟练,还需要更多的学习和练习。
参考文献
[1]王华,岳丽全,岳志高.MSComm控件在VC++6.0串口通信中的应用.
长春工程学院学报:
自然科学版,2009,10
(1)
[2]郑丽,董渊,张瑞丰编著.C++语言程序设计(第三版)北京:
清华大学出版社,2004
[3]郑丽,董渊,张瑞丰编著.VisualC++6.0MFC类库参考手册.北京:
人民邮电出版社,2002
目录
1引言1
1.1问题的提出1
1.2国内外研究的现状2
1.3任务与分析2
2程序的主要功能2
2.1串口选择、打开、关闭功能2
2.2发送数据功能2
2.3接收功能2
2.4发送、接收计数并显示功能3
2.5清除显示功能3
2.6退出程序功能3
3程序运行平台3
4总体设计4
6模块分析6
6.1初始化模块6
6.2串口选择模块7
6.3发送数据、发送计数显示模块10
6.4数据接收、接收计数显示模块10
6.5清