课程设计基于串口通信的高级语言控制程序的设计.docx
- 文档编号:13352224
- 上传时间:2023-06-13
- 格式:DOCX
- 页数:18
- 大小:190.04KB
课程设计基于串口通信的高级语言控制程序的设计.docx
《课程设计基于串口通信的高级语言控制程序的设计.docx》由会员分享,可在线阅读,更多相关《课程设计基于串口通信的高级语言控制程序的设计.docx(18页珍藏版)》请在冰点文库上搜索。
课程设计基于串口通信的高级语言控制程序的设计
目录
1引言1
1.1问题的提出1
1.2国内外研究的现状1
1.5任务与分析2
1.5.1主要任务2
1.5.2分析2
2程序的主要功能2
2.1参数设置功能2
2.2参数显示功能2
2.3打开串口功能2
2.4关闭串口功能2
2.5接收数据功能3
2.6发送数据功能3
2.7清空数据接收区和发送区功能3
3程序运行平台3
4总体设计4
5程序变量定义说明4
6模块分析5
6.1初始化模块5
6.2参数设置和显示模块6
6.3发送数据模块8
6.4数据接收模块9
6.5清空接数据模块10
6.6关闭串口模块10
7系统测试11
7.1测试11
7.2总结16
8结论16
参考文献16
摘要
随着计算机的普及,计算机网络和多微机系统的广泛应用,尽管当今USB通信技术和以太网技术快速发展,然而串口通信技术始终以其连接简便,价格低廉,稳定可靠等优点,在计算机通信领域占有一席之地。
MSCOmm控件是微软公司为了用户使用方便而提供的一种便捷的控制串口编程的解决方案,本文主要介绍了如何利用VC++2008MSComm控件的串口通信方法,对程序的类进行了说明,分析了本程序各个模块怎样实现起作用。
此次设计以MFC来设计界面编制程序,同时利用MSComm控件通过串口发送和接收数据,实现了串口通信。
该串口通信控制程序具有通信参数设置、通信参数显示、打开和关闭串口、接收数据、发送数据、清空发送区和接收区数据的功能。
关键词:
串口通信visualc++6.0MSComm控件
1引言
1.1问题的提出
串行通信(SerialCommunication)在现代工业控制系统中一直有着及其重要的地位,作为一种基本而又灵活方便的通信方式,它被广泛应用于PC与PC或者PC与PLC之间的数据交换以及其他工业控制与自动控制中,它不仅没有因为时代的进步而遭淘汰,反而在规格上越来越完善,应用也越来越广泛。
VC++是新一代面向对象的可视化开发工具,提供了良好的界面设计能力,在PC机的串口通信方面有很强的功能。
对于从事机械行业的人来说,熟悉基于RS232串口通信的高级语言编程方法显得十分重要。
1.2国内外研究的现状
目前,计算机的串行通信应用十分广泛,串行接口已成为计算机的必需部件和接口之一。
由于其具有连接简单、使用灵活方便、数据传递可靠等优点,在工业监控、数据采集和实时控制系统中得到了广泛应用。
当今,实现串口通信的方法以及第三方控件有很多,例如PComm控件,WindowsAPI函数等等。
但是这几种方法都过于复杂,对程序员要求较高,而且可靠性并不是很好。
利用Microsoft推出的MSComm控件,使得串口通信的实现更为简单、可靠。
随着当今信息技术的快速发展,通信已成为信息技术中的关键问题。
尤其在控制领域,以何种方式实现计算机与外围设备间既简单又可靠的通信,就显得特别重要。
由于串行通信具有实现简单、使用灵活方便、数据传输可靠等优点,因而广泛应用于工业控制系统中,是计算机与外部设备进行数据通信时经常使用的方式之一。
VC++是新一代面向对象的可视化开发工具,提供了良好的界面设计能力,在PC机的串口通信方面有很强的功能。
它具有功能强大、简便易用和代码执行速度快等特点,在通信软件的开发中成为越来越多开发人员的首选工具。
无论在工业控制中PC机和单片机之间的通信,还是在2台Pc机之间的串口通信,都具有相同的原理。
只要掌握其中的通信本质,就能灵活地实现串口通信,串口控制。
1.5任务与分析
1.5.1主要任务
★制定串口通信控制程序的总体构架;
★熟悉VC平台下的高级语言编程方法;
★熟悉基于RS232串口通信的高级语言编程方法;
★在同一台PC机上调试通过所编写的程序;
1.5.2分析
目前Win32中基于VC++6.0的常用串口通信程序一般可以用两种方法实现:
①利用MSCommActiveX串行通信控件;②使用Win2dowsAPI通信函数。
虽然在Windows下Win32API提供了使用文件操作方式的函数进行串口操作的方法,但是在编程实现上还是比较复杂。
Windows平台先进的ActiveX技术使得对串口编程不再需要处理烦琐的细节。
利用已有的AxtiveX控件,只需要编写少量的代码,就可以轻松高效地完成任务。
因此程序员不需要花时间去了解复杂的API函数,只需要利用MSComm控件就可实现串口编程。
2程序的主要功能
2.1参数设置功能
设置和修改串口通信参数,包括端口,波特率,奇偶校验位,数据位,停止位。
2.2参数显示功能
显示当前串口通信参数,包括端口号,波特率,奇偶校验位,数据位,停止位。
2.3打开串口功能
打开串口,实现通信。
2.4关闭串口功能
关闭串口,停止通信。
2.5接收数据功能
能够进行单个或多个数据的接收和显示。
2.6发送数据功能
能够进行单个或多个数据的发送。
2.7清空数据接收区和发生区功能
删除接收区和发生区所有数据。
3程序运行平台
Visualc++6.0
具体操作如下:
(1)新建MSComm项目,选择MFC应用程序,应用程序类型选择“基于对话框”,生成的类中选择“CMSCommDlg”;
(2)为MSComm项目添加新建一个Dialog设置对话框;
(3)加载MSComm控件,添加相应的源程序,加载必要的控件;
(4)编写程序代码,再编译,链接,调试,执行等,生成应用程序。
4总体设计
图4.1系统总体框架图
5程序变量定义说明
控件名
程序中控件名
变量名
变量类型
串口选择组合框
IDC_COMBO1
m_td
CComboBox
波特率选择组合框
IDC_COMBO2
m_btl
CComboBox
校检位组合框
IDC_COMBO3
m_xjw
CComboBox
数据位组合框
IDC_COMBO4
m_sjw
CComboBox
停止位组合框
IDC_COMBO5
m_tzw
CComboBox
接收编辑框
IDC_EBIT1
m_str_recv
Cstring
发送编辑框
IDC_EBIT2
m_str_send
Cstring
复选框
IDC_CHECK1
/
/
COM控件
IDC_MSCOMM1
m_msomm
CMSComm
6模块分析
6.1初始化模块
代码如下:
BOOLCMyDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
m_msomm.SetInBufferSize(1024);//设置接收缓冲区的大小
m_msomm.SetOutBufferSize(512);//设置发送缓冲区的大小
if(m_msomm.GetPortOpen())//判断串口是否打开
m_msomm.SetPortOpen(FALSE);//串口如果打开就关闭它
m_msomm.SetCommPort
(2);//设置通道为COM2
if(!
m_msomm.GetPortOpen())//判断串口是否打开
m_msomm.SetPortOpen(TRUE);//如果没有打开就重新开启
else
AfxMessageBox("serialportopenerror");
m_msomm.SetInputMode
(1);//设置以二进制方式接收
m_msomm.SetSettings("9600,n,8,1");//设置波特率9600,无校检位,8位数据位,1位停止位
m_msomm.SetRThreshold
(1);//串口接收缓冲区有多于或等于一个字符是产生接收数据的OnOnComm
m_msomm.SetInputLen(0);//设置当前接收区长度为零
m_msomm.GetInput();//预读取缓冲区以清空残留数据
//组合框的初始化
m_td.SetCurSel
(1);
m_btl.SetCurSel(5);
m_xjw.SetCurSel
(2);
m_sjw.SetCurSel(0);
m_tzw.SetCurSel(0);
//Add"About..."menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
6.2参数设置和显示模块
选择组合框中相应的设置内容即可设置串口的通信参数,如图7.1。
该命令的代码如下:
voidCMyDlg:
:
OnSelchangeCombo1()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
//改变串口通道
if(m_msomm.GetPortOpen())
m_msomm.SetPortOpen(FALSE);
m_msomm.SetCommPort(m_td.GetCurSel()+1);
m_msomm.SetPortOpen(TRUE);
}
voidCMyDlg:
:
OnSelchangeCombo2()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
//改变波特率
inti=m_btl.GetCurSel();
switch(i)
{
case0:
m_msomm.SetSettings("300,,,");break;
case1:
m_msomm.SetSettings("600,,,");break;
case2:
m_msomm.SetSettings("1200,,,");break;
case3:
m_msomm.SetSettings("2400,,,");break;
case4:
m_msomm.SetSettings("4800,,,");break;
case5:
m_msomm.SetSettings("9600,,,");break;
case6:
m_msomm.SetSettings("19200,,,");break;
case7:
m_msomm.SetSettings("38400,,,");break;
}
}
voidCMyDlg:
:
OnSelchangeCombo4()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
//改变数据位
inti=m_sjw.GetCurSel();
switch(i)
{
case0:
m_msomm.SetSettings(",,8,");break;
case1:
m_msomm.SetSettings(",,7,");break;
case2:
m_msomm.SetSettings(",,6,");break;
}
}
voidCMyDlg:
:
OnSelchangeCombo5()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
//改变停止位
inti=m_tzw.GetCurSel();
switch(i)
{
case0:
m_msomm.SetSettings(",,,1");break;
case1:
m_msomm.SetSettings(",,,2");break;
}
}
voidCMyDlg:
:
OnSelchangeCombo3()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
//改变校检位
inti=m_xjw.GetCurSel();
switch(i)
{
case0:
m_msomm.SetSettings(",N,,");break;
case1:
m_msomm.SetSettings(",O,,");break;
case2:
m_msomm.SetSettings(",E,,");break;
}
}
6.3发送数据模块
单击主界面中的【数据发送】按钮,将把发送区的内容发送到串口调试助手的接收区,如图7.3,该命令的代码如下:
voidCMyDlg:
:
OnOsend()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
//发送数据
UpdateData
(1);
m_msomm.SetOutput(COleVariant(m_str_send));
}
6.4数据接收模块
如图7.2,程序代码如下:
voidCMyDlg:
:
OnOnCommMscomm1()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
//定义参数
COleSafeArrayx;
VARIANTy;
BYTErxdata[1024];
CStringa;
LONGlen,k;
//判断是否接受数据,进行类型转换
if(m_msomm.GetCommEvent()==2)
{
y=m_msomm.GetInput();//读取接收缓冲区的内容
x=y;
len=x.GetOneDimSize();
for(k=0;k x.GetElement(&k,rxdata+k); for(k=0;k {BYTEbt=*(char*)(rxdata+k); if(! m_16.GetCheck()) {a.Format("%c",bt); m_str_recv+=a;} else {a.Format("%02X",bt);//十六进制转换 m_str_recv+=a+"";} } } UpdateData(0);//显示数据 } 6.5清空接数据模块 单击主界面中的【清空】按钮,将清空所有数据,如图7.4,该命令的代码如下: voidCMyDlg: : OnButton4() { //TODO: Addyourcontrolnotificationhandlercodehere //清空接收,发送框的内容 m_str_send=""; m_str_recv=""; UpdateData(0); } 6.6关闭串口模块 单击主界面中的【关闭串口】按钮,将关闭串口,该命令的代码如下: voidCMyDlg: : OnButton1() { //TODO: Addyourcontrolnotificationhandlercodehere //串口的开关 intx=m_msomm.GetPortOpen(); m_msomm.SetPortOpen(! x); } 7系统测试 7.1测试 首先,直接双击MSComm文件夹下的debug子文件夹下的MSComm.exe运行文件; 其次,按以下步骤进行测试: (1)参数设置: 图7.1参数设置 (2)接收数据: 图7.2(a)串口调试助手发送数据 图7.2(b)串口通信工具接收数据 图7.3(a)串口助手发送十六进制数据 图7.3(b)串口工具接收并显示十六进制数据 (3)发送数据 图7.3(c)串口工具发送数据 图7.3(d)调试助手接收数据 (4)清空接收区 图7.4清空接收区 7.2总结 通过上述测试,本系统实现了参数设置与显示、打开关闭串口、接收和发送数据、自动发送、十六进制显示、清空数据接收区和发送区内容的功能,同时,能够在任何时候更改串口参数。 8结论 本次课程设计,在visualc++6.0平台下,利用MSComm控件编写串口通信程序,实现了串口通信参数设置与显示、打开和关闭串口、接收和发送数据(包括十六进制的接收)、清空接收区和发送区内容的功能。 同时,本串口通信程序能避免在串口未打开时发送接收数据。 但是,本程序也存在一些不足,如没有串口开关状态的提示,如果在数据发送过程中改变串口设置会接收、发送数据会出现错误,所有不要再发送数据过程中更改串口参数。 本次课程设计,利用VC++下的MSComm控件编程方法,通过MSComm控件可以十分便捷地写出灵活性高,移植性强的串口通信程序,避免了去了解一些复杂的windowsAPI函数。 这种方法具有很强的实用性,可以广泛地用于工业数据采集等领域。 参考文献 [1]李强,贾云霞编著.VisualC++项目开发实践.北京: 中国铁道出版社,2003 [2]张筠莉,刘书智编著.visualc++实践与提高-串口通信与工程应用篇. 北京: 中国铁道出版社,2006 [3]淑慧VC++6.0环境下GPS接收机串口通信的实现[期刊论文]-测绘信息与工程2002(5) [4]王华,岳丽全,岳志高.MSComm控件在VC++6.0串口通信中的应用. 长春工程学院学报: 自然科学版,2009,10 (1) [5]王莉,阳春华.基于VC++的串口通信设计及其应用[J].控制工程,2004,11(S1): 89292.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 基于 串口 通信 高级 语言 控制程序 设计