基于MSComm控件C++课程设计Word文档下载推荐.docx
- 文档编号:6283661
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:22
- 大小:281.37KB
基于MSComm控件C++课程设计Word文档下载推荐.docx
《基于MSComm控件C++课程设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于MSComm控件C++课程设计Word文档下载推荐.docx(22页珍藏版)》请在冰点文库上搜索。
参考文献15
图1-1智能仪器示意图
引言
目前仪器仪表的智能化程度越来越高,大量的智能仪器都配备了RS-232通信接口,并提供了相应的通信协议,能够将测试、采集的数据传输给计算机等设备,以便进行大量数据的储存、处理、查询和分析。
图1-1所示为某型号智能仪器示意图。
1.1问题的提出
在现代化的测控系统中,串口通信有着十分重要的作用,然而,不同测控系统对串口通信的需求也不尽相同,因此会用高级语言设计串口通信的控制程序也变得很重要。
与测控相关的专业就开设了高级语言在测控中的应用课程设计。
基于串口通信的高级语言的控制程序的设计就是本次课程设计的题目。
1.2国内外研究的现状
目前,计算机的串行通信应用十分广泛,串行接口已成为计算机的必需部件和接口之一。
由于其具有连接简单、使用灵活方便、数据传递可靠等优点,在工业监控、数据采集和实时控制系统中得到了广泛应用。
当今,实现串口通信的方法以及第三方控件有很多,例如PComm控件,WindowsAPI函数等等。
但是这几种方法都过于复杂,对程序员要求较高,而且可靠性并不是很好。
利用Microsoft推出的MSComm控件,使得串口通信的实现更为简单、可靠。
随着当今信息技术的快速发展,通信已成为信息技术中的关键问题。
尤其在控制领域,以何种方式实现计算机与外围设备间既简单又可靠的通信,就显得特别重要。
由于串行通信具有实现简单、使用灵活方便、数据传输可靠等优点,因而广泛应用于工业控制系统中,是计算机与外部设备进行数据通信时经常使用的方式之一。
VC++是新一代面向对象的可视化开发工具,提供了良好的界面设计能力,在PC机的串口通信方面有很强的功能。
它具有功能强大、简便易用和代码执行速度快等特点,在通信软件的开发中成为越来越多开发人员的首选工具。
无论在工业控制中PC机和单片机之间的通信,还是在2台Pc机之间的串口通信,都具有相同的原理。
只要掌握其中的通信本质,就能灵活地实现串口通信,串口控制。
1.3任务与分析
(1).任务:
本课题是要求设计一个基于VC++平台下串口通信的控制程序,该程序必须有着良好的用户界面、能够设置端口的参数、能在同一台计算机上进行调试和可进行单个数据或成批数据的传送。
主要的目的是通过该课程设计进一步掌握计算机串口通信和高级语言的相关知识,同时,深入学习串口通信知识,掌握实现串口通信编程技巧。
(2).分析:
利用VisualC++开发串口通信程序既可以使用MSComm控件也可以调用WindowsAPI函数。
不过,只要MSComm可以被选用,它几乎总是这类设计的优先选择。
当然,本次设计所涉及到了功能要求,选用MSComm控件是能完成的,所以,该设计也将选用MSComm控件方式来完成。
2程序的主要功能
2.1发送功能
发送字符串时,在发送框里输入字符串,按“发送”按钮,开始把发送文本框内的字符发送到接受文本框内,发送文件时按“选择发送文件”按钮,选中所要发送的文件,点击“发送”按钮,则可在接受文本框里显示所发送的文件内容。
2.2退出程序
按“退出”按钮,程序窗口关闭,结束程序运行。
2.3清除功能
按接受字符区的“清空”按钮,则清空接受文本框内的字符。
按发送字符区的“清空”按钮,将发送文本框内容清空。
3程序运行平台
3.1建立工程
(1).启动VisualC++6.0,单击“文件”菜单中的“新建”命令,显示新建对话框,选择“MFCAppWizard(exe)”工程类型,输入需要创建工程的名称“lzhh”和目录。
(2).按照弹出的应用向导对话框依次填写,第1步选择基于对话框,其他均采用默认。
(3).单击“完成”按钮,将会弹出一个关于新工程信息的对话框。
单击“确定”按钮,这样MFC向导便自动生成了一个名称为“lzhh”的工程。
3.2资源创建
(1).应用程序中添加了一个对话框资源IDD_lzhh_DIALOG,打开属性对话框,将对话框标题改为“应用程序中添加了一个对话框资源IDD_lzhh_DIALOG”。
(2).为了实现计算机与计算机的串口通信,添加MScomm控件。
选择“工程”菜单中的“添加工程”下的“ComponentsandControls”选项,在弹出的对话框中双击“RegisteredActiveXControls”项,选择“MicrosoftCommunicationsControl,version6.0”项,单击“Insert”按钮,在弹出的对话框中单击“OK”按钮,再在弹出的对话框中单击“结束”按钮关闭对话框,所选择的控件就会出现在“控件面板”中,然后将其添加到对话框中相应位置。
(3).删除对话框中原来的Static文本,用面板为对话框添加如表3-1所示的控件,并按照图3-1所示放置。
图3-1程序主界面
图3-2参数设置界面
表3-1程序主界面内的控件类型、ID及相关属性
控件类型
ID号
标题
属性
功能
组框
默认
接收字符
标签
待发字符
复选框
IDC_CHECK1
允许自动发送
自动发送选择
IDC_CHECK2
接收十六进制数
接收十六进制选择
编辑框
IDC_REC
——
(自动)垂直滚动(√)
显示接收字符区
多行(√)只读(√)
IDC_SEND
显示发送字符区
多行(√)
MSComm
IDC_MSCOMM1
在程序中设置
串口参数设置
按钮
IDOK
手动发送
发送字符命令
IDCANCEL
开始接收
关闭程序命令
IDC_BUTTON1
参数设置
设置串口相关参数
IDC_BUTTON2
清空重填
清空发送区
IDC_BUTTON3
清空重接
清空接收区
IDC_BUTTON4
退出程序
关闭窗口
(4).选中在当前窗口的“Dialg”单击鼠标右键选择“插入Dialg”,同步骤1将对话框标题改为“参数设置”,同步骤3删除对话框中原来的Static文本,用面板为对话框添加如表3-2所示的控件,并按照图3-2所示放置。
(5).添加成员变量,在“查看”菜单中或在对话框上单击鼠标右键,修改类名为“CSettingDlg”,再打开“ClassWizard”对话框中的“MemberVariables”标签,选中所需的控件ID号,双击鼠标左键或单击AddVariables按钮,依次为表3-3中所列控件增加成员变量。
表3-2参数设置界面内的控件类型、ID及相关属性
静态文本
ms
端口
自动发送周期
串口参数
IDC_EDIT1
设置端口
IDC_EDIT2
设置时间
IDC_EDIT3
设置串口参数
确定
更新参数
取消
参数还原
表3-3成员变量
控件ID号
变量类型
变量名
CMSComm
m_COMM
CString
m_Rec
m_Send
CButton
m_ctrlSend
m_ctrlRec
int
m_nPort
m_nTime
m_strSetting
(6).切换到ClassWizard的MessageMaps标签页为相应控件添加相应的消息响应函数,对照表3-4。
表3-4主界面控件函数
函数类型
函数名
CLzhhDlg
WM_TIMER
OnTimer
OnComm
OnOnCommMscomm
ON_BN_CLICKED
OnSetting
OnClsS
OnClsR
OnEnd
OnRec
OnSend
4总体设计
要满足这个设计所需要的界面是两个,通过主界面上的相关控件可以弹出另一界面。
当然,另一界面也是单独的一个类,其只是有些控件有变量没有功能函数,所以,就没有给出它框架图。
然而,MScomm控件的相关功能函数是系统默认的,这里也没必要给出。
如此,就给出了系统总体框架图,如图4.1。
图4-1系统总体框架图
5程序类的说明
本程序涉及到了四个类,其分别是ClzhhApp、CLzhhDlg、CMSComm和CsettingDlg。
除CLzhhDlg需要添加一些程序外,其余的都以VC++自动生成的程序为准。
CLzhhDlg添加的代码如下:
classCLzhhDlg:
publicCDialog
{
//Construction
public:
CLzhhDlg(CWnd*pParent=NULL);
//standardconstructor
BOOLbRec;
//接收按键标志
BOOLbSend;
//自动发送模式发送键标志
BOOLCheck1;
//自动发送复选框选中标志
BOOLCheck2;
//十六进制复选框选中标志
CStringm_strSetting;
CStringstrSetting;
intm_nTime;
intm_nPort;
voidOpenPort();
//串口开起函数
//DialogData
……//自动生成部分
}
6程序流程及代码实现
图6-1设计程序流程图
根据第4小节的系统总体框架图和第5小节中的给类加的数据成员与函数成员设计了程序流程图,如图6-1。
在程序流程图中,虽然每个按键控件和复选框都是能单独动作,但是其每次的动作都可能改变标志,从而影响到其它控件动作结果,甚至改变到程序的运行,这就完成了控件关系。
在lzhhDlg.cpp文件中,设置初始化函数OnInitDialog(),添加代码实现对话框各控件的初始化工作,如下:
BOOLCLzhhDlg:
:
OnInitDialog()
{//VC自动生成的代码
//TODO:
Addextrainitializationhere
bSend=FALSE;
bRec=FALSE;
Check1=FALSE;
Check2=FALSE;
m_nPort=1;
m_nTime=1000;
m_strSetting=_T("
9600,n,8,1"
);
OpenPort();
returnTRUE;
//returnTRUEunlessyousetthefocustoacontrol
6.1发送函数
实现接收按钮相应的响应函数OnSend()。
代码如下:
voidCLzhhDlg:
OnSend()
//TODO:
Addyourcontrolnotificationhandlercodehere
if(Check1)//自动发送模式
{
bSend=!
bSend;
if(bSend)
{
SetTimer(1,m_nTime,NULL);
m_ctrlSend.SetWindowText(_T("
停止发送"
));
}
else
KillTimer
(1);
自动发送"
}
}
else//手动发送模式
{
UpdateData(TRUE);
m_COMM.SetOutput(COleVariant(m_Send));
手动发送"
}
6.2接收函数
实现接发送钮相应的响应函数OnRec()。
OnRec()
m_COMM.GetInput();
bRec=!
bRec;
if(bRec)
{
m_ctrlRec.SetWindowText(_T("
停止接收"
else
m_ctrlRec.SetWindowText(_T("
开始接收"
6.3退出函数
实现退出按钮相应的响应函数OnEnd()。
OnEnd()
CDialog:
OnOK();
6.4清空函数
实现清空按钮相应的响应函数OnClsR()和OnClsS()。
OnClsR()
bRec=0;
m_Rec=_T("
"
SetDlgItemText(IDC_REC,m_Rec);
OnClsS()
bSend=0;
m_Send=_T("
SetDlgItemText(IDC_SEND,m_Send);
if(Check1)//自动模式
6.5其他函数
(1).参数设置按钮的响应函数OnSetting()。
OnSetting()
Addyourcontrolnotificationhandlercodehere
CSettingDlgsetDlg;
setDlg.m_nPort=m_nPort;
setDlg.m_nTime=m_nTime;
setDlg.m_strSetting=m_strSetting;
if(setDlg.DoModal()==IDOK)
m_nPort=setDlg.m_nPort;
m_nTime=setDlg.m_nTime;
m_strSetting=setDlg.m_strSetting;
OpenPort();
if(Check1&
&
bSend)
(2).串口控件响应函数OnOnCommMscomm()。
OnOnCommMscomm()
VARIANTvariant_inp;
COleSafeArraysafearray_inp;
LONGlen,k;
BYTErxdata[2048];
//设置BYTE数组An8-bitintegerthatisnotsigned.
CStringstrtemp;
CStringstrtemp_R;
if(m_COMM.GetCommEvent()==2)//事件值为2表示接收缓冲区内有字符
{
variant_inp=m_COMM.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);
//字符型
if(!
Check2)
strtemp.Format("
%c"
bt);
//将字符送入临时变量strtemp存放
if(Check2)//显示十六进制
strtemp.Format("
%02X"
m_Rec+=strtemp;
//加入接收编辑框对应字符串
}
elsem_Rec=_T("
(没有字符)"
//更新接收编辑框对应字符串
(3).周期响应函数OnTimer()。
OnTimer(UINTnIDEvent)
Addyourmessagehandlercodehereand/orcalldefault
UpdateData(TRUE);
//读取编辑框内容
m_COMM.SetOutput(COleVariant(m_Send));
OnTimer(nIDEvent);
(4).自动发送和十六进制复选框动作响应函数分别是OnCheck1()和OnCheck2()。
OnCheck1()
Check1=!
Check1;
//自动发送标志取反
if(Check1)//允许自动发送
bSend=0;
}
Check1)//手动发送
OnCheck2()
Check2=!
Check2;
//十六进制标志取反
(5).在lzhhDlg.h文件里自定义串口打开函数OpenPort()。
OpenPort()//打开串口
if(m_COMM.GetPortOpen())
m_COMM.SetPortOpen(FALSE);
m_COMM.SetCommPort(m_nPort);
m_COMM.GetPortOpen())
m_COMM.SetPortOpen(TRUE);
AfxMessageBox("
cannaotopenserialport"
m_COMM.SetSettings(m_strSetting);
m_COMM.SetRThreshold
(1);
m_COMM.SetInputMode
(1);
m_COMM.SetInputLen(0);
7系统测试
程序的打开方法是:
首先进入VC++6.0,打开工程lzhh.dsw,然后进入源程序,接着选择Build下的Executelzhh.exe即可,也可以不打开工程,直接双击lzhh文件夹下的debug或release子文件夹下的lzhh.exe文件即可运行程序。
图7-1参数设置
第一步,打开两个运行程序,设置端口分别为3和4其余参数均为默认,如图7-1。
第二步,按下两个界面的“开始接收”按钮。
图7-2发送数据的结果
第三步,分别在两个界面的“待发字符”的编辑框内写入一些任意字符,左边界面选择自动发送模式,右边界面选择手动发送模式,单击右边界面的“手动发送”按钮,左边界面的“接收字符”的只读编辑框内出现左边所写入是字符。
同样,按下左边界面的“自动发送”按钮,右边界面的“接收字符”的只读编辑框内出现左边所写入是字符,而且,每隔1000ms接收到相同字符,如图7-2和7-3。
图7-4接收十六进制的结果
图7-3接收数据的结果
第四步,保持端口不变,修改串口参数,且为相同可用参数。
在第三步的方法仍然可以得到相同的结果。
第五步,按右边界面的“退出程序”窗口关闭。
打开串口调试小助手,设置串口为“COM4”其它参数相同,串口调试小助手自动发送十六进制数,设计程序界面接收十六进制数,如图7-4。
第六步,按“清空重发”和“清空重接”本别清空发送区和接收区的字符。
按“退出程序”窗口关闭。
通过以上测试,本系统实现了数据的接收与发送功能,也
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 MSComm 控件 C+ 课程设计
![提示](https://static.bingdoc.com/images/bang_tan.gif)