课程设计基于串口通信的高级语言控制程序的设计_第1页
课程设计基于串口通信的高级语言控制程序的设计_第2页
课程设计基于串口通信的高级语言控制程序的设计_第3页
课程设计基于串口通信的高级语言控制程序的设计_第4页
课程设计基于串口通信的高级语言控制程序的设计_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目目 录录 1 引言引言.1 1.1 问题的提出.1 1.2 国内外研究的现状.1 1.3 任务与分析.2 1.4 主要任务.2 1.5 分析.2 2 程序的主要功能程序的主要功能.2 2.1 参数设置功能.2 2.2 参数显示功能.2 2.3 打开串口功能.2 2.4 关闭串口功能.2 2.5 接收数据功能.3 2.6 发送数据功能.3 2.7 清空数据接收区功能.3 2.8 清空数据发送区功能.3 2.9 自动发送功能.3 2.10 十六进制显示功能.3 2.11 十六进制发送功能.3 3 程序运行平台程序运行平台.3 4 总体设计总体设计.4 5 5 程序类的说明程序类的说明.4 6 6

2、 模块分析模块分析.6 6.1 参数设置和显示模块.6 6.2 打开串口模块.9 6.3 发送数据模块.9 6.4 自动发送模块.10 6.5 接收数据模块.11 6.6 清空接收区模块.12 6.7 清空发送区模块.12 6.8 关闭串口模块 .12 7 7 系统测试系统测试.13 7.1 测试.13 7.2 总结.18 8 8 结论结论.18 9 参考文献参考文献.19 摘摘 要要 随着计算机的普及,计算机网络和多微机系统的广泛应用,尽管当今 usb 通信技术和以太网技术快速发展,然而串口通信技术始终以其连接简便, 价格低廉,稳定可靠等优点,在计算机通信领域占有一席之地。mscomm 控

3、件是微软公司为了用户使用方便而提供的一种便捷的控制串口编程的解决方 案,本文主要介绍了如何利用 vc + + 2008 mscomm 控件的串口通信方法, 对程序的类进行了说明,分析了本程序各个模块怎样实现起作用。此次设计 以 mfc 来设计界面编制程序,同时利用 mscomm 控件通过串口发送和接收数 据,实现了串口通信。该串口通信控制程序具有通信参数设置、通信参数显 示、打开和关闭串口、接收数据、发送数据、清空发送区和接收区数据的功 能。 关键词关键词:串口通信visual studio 2008 mscomm 控件 1 1 引言引言 1.1 问题的提出问题的提出 串行通信(serial

4、communication )在现代工业控制系统中一直有着及其重要的地 位,作为一种基本而又灵活方便的通信方式,它被广泛应用于 pc 与 pc 或者 pc 与 plc 之 间的数据交换以及其他工业控制与自动控制中,它不仅没有因为时代的进步而遭淘汰, 反而在规格上越来越完善,应用也越来越广泛。vc+是新一代面向对象的可视化开发工 具,提供了良好的界面设计能力,在 pc 机的串口通信方面有很强的功能。对于从事机 械行业的人来说,熟悉基于 rs232 串口通信的高级语言编程方法显得十分重要。 1.2 国内外研究的现状国内外研究的现状 目前,计算机的串行通信应用十分广泛,串行接口已成为计算机的必需部件

5、和接 口之一。由于其具有连接简单、使用灵活方便、数据传递可靠等优点,在工业监控、 数据采集和实时控制系统中得到了广泛应用。当今,实现串口通信的方法以及第三方控 件有很多,例如 pcomm 控件,windows api 函数等等。但是这几种方法都过于复杂,对程 序员要求较高,而且可靠性并不是很好。利用 microsoft 推出的 mscomm 控件,使得串口 通信的实现更为简单、可靠。 随着当今信息技术的快速发展,通信已成为信息技术中的关键问题。尤其在控制 领域,以何种方式实现计算机与外围设备间既简单又可靠的通信,就显得特别重要。 由于串行通信具有实现简单、使用灵活方便、数据传输可靠等优点,因而

6、广泛应用于 工业控制系统中,是计算机与外部设备进行数据通信时经常使用的方式之一。vc+是 新一代面向对象的可视化开发工具,提供了良好的界面设计能力,在 pc 机的串口通信 方面有很强的功能。它具有功能强大、简便易用和代码执行速度快等特点,在通信软 件的开发中成为越来越多开发人员的首选工具。无论在工业控制中 pc 机和单片机之间 的通信,还是在 2 台 pc 机之间的串口通信,都具有相同的原理。只要掌握其中的通信 本质,就能灵活地实现串口通信,串口控制。 串口通讯,是工业自动化、智能终端、通信管理等领域传统且重要的通讯手段。 最常用到的串口通信模式往往是两种:rs232 和 rs485。其中 r

7、s232 通讯方式有三线制 和九线制两种。工业控制中,用户常常使用单片机的串口通讯功能实现与上位机 通讯,实现多机通讯。例如,工业现场有很多具备串口通讯功能的端表,在几十米外 的中控室,你可以通过串口通讯随时读取表的运行状态和相关数据,端表异常的时候 马上在中控室就能知道,这样免去了很多麻烦,为实现工业上的自动控制打下了很好 的基础。某些用户还可以根据实际情况需要,在串口上添加光电隔离电路,以达 到保护端口的目的。这个只是串口通讯功能的一个缩影,在实际生活中串口通讯将发 挥更大的作用。 1.3 任务与分析任务与分析 1.4 主要任务主要任务 制定串口通信控制程序的总体构架; 熟悉 vc 平台下

8、的高级语言编程方法; 熟悉基于 rs232 串口通信的高级语言编程方法; 在同一台 pc 机上调试通过所编写的程序; 1.5 分析分析 目前 win32 中基于 vc + + 6. 0 的常用串口通信程序一般可以用两种方法实现: 利用 mscomm activex 串行通信控件; 使用 win2dows api 通信函数。虽然在 windows 下 win32api 提供了使用文件操作方式的函数进行串口操作的方法,但是在编 程实现上还是比较复杂。windows 平台先进的 activex 技术使得对串口编程不再需要处 理烦琐的细节。利用已有的 axtivex 控件,只需要编写少量的代码,就可以

9、轻松高效 地完成任务。因此程序员不需要花时间去了解复杂的 api 函数,只需要利用 mscomm 控 件就可实现串口编程。 2 程序的主要功能程序的主要功能 2.1 参数设置功能参数设置功能 设置和修改串口通信参数,包括端口,波特率,奇偶校验位,数据位,停止位。 2.2 参数显示功能参数显示功能 显示当前串口通信参数,包括端口号,波特率,奇偶校验位,数据位,停止位。 2.3 打开串口功能打开串口功能 参数设置后,才能打开串口,实现通信。 2.4 关闭串口功能关闭串口功能 关闭串口,停止通信。 2.5 接收数据功能接收数据功能 能够进行单个或多个数据的接收和显示。 2.6 发送数据功能发送数据功

10、能 能够进行单个或多个数据的发送。 2.7 清空数据接收区功能清空数据接收区功能 删除接收区所有数据。 2.8 清空数据发送区功能清空数据发送区功能 清除发送区内所有数据。 2.9 自动发送功能自动发送功能 能把发送区内的数据每 2s 自动发送。 2.10 十六进制显示功能十六进制显示功能 在接收区只显示十六进制数,每两个字符一个空格。 2.11 十六进制发送功能十六进制发送功能 只能发送十六进制数,不能发送非十六进制数。 3 程序运行平台程序运行平台 visual studio 2008 具体操作如下: (1)新建 mscomm 项目,选择 mfc 应用程序,应用程序类型选择“基于对话框”

11、, 生成的类中选择“cmscommdlg” ; (2)为 mscomm 项目添加新建一个 dialog 设置对话框; (3)加载 mscomm 控件,添加相应的源程序,加载必要的控件; (4)编写程序代码,再编译,链接,调试,执行等,生成应用程序。 4 总体设计总体设计 图 4.1 系统总体框架图 5 程序类的说明 class cmscommdlg : : public cdialog / 构造 public: cmscommdlg(cwnd* pparent = = null);/ 标准构造函数 / 对话框数据 int oncreate(lpcreatestruct lpcreatestru

12、ct); int string2hex(cstring str, cbytearray char converthexchar(char ch); enum idd = = idd_mscomm_dialog ; protected: 主 函 数 参 数 设 置 和 显 示 打 开 和 关 闭 串 口 发 送 数 据 接 收 数 据 清 空 接 收 区 清 空 发 送 区 virtual void dodataexchange(cdataexchange* pdx); / ddx/ddv 支持 / 实现 protected: hicon m_hicon; / 生成的消息映射函数 virtual

13、 bool oninitdialog(); afx_msg void onsyscommand(uint nid, lparam lparam); afx_msg void onpaint(); afx_msg hcursor onquerydragicon(); declare_message_map() public: cmscomm m_mscom;/声明m_mscomm变量为cmscomm类型 cstring m_recv;/接收区 cstring m_send;/发送区 csetupdlg mysetupdlg;/声明设置对话框 byte mycom;/串口号码 cstring my

14、parity;/奇偶校验类型 cstring mybaudrate;/通信波特率 cstring mydata;/数据位 cstring mystop;/停止位 declare_eventsink_map() void oncommmscomm1(); afx_msg void onbnclickedsendbutton(); afx_msg void onbnclickedclearsend(); afx_msg void onbnclickedclearrecv(); afx_msg void onbnclickedsetupcom(); afx_msg void onbnclickedo

15、pencom(); afx_msg void onbnclickedclosecom(); afx_msg void ontimer(uint_ptr nidevent); afx_msg void onbnclickedcheckautosend(); cbutton m_opencom;/打开串口按钮 cbutton m_closecom;/关闭串口按钮 cbutton m_setupcom;/设置按钮 cstring m_para;/通信参数显示 cbutton m_clearrecv;/清空接收按钮 cbutton m_clearsend;/清空发送按钮 cbutton m_sendt

16、ext;/发送按钮 cbutton m_ctrlhexsend;/十六进制发送 cbutton m_ctrlhexdisplay;/十六进制显示 bool m_bautosend;/自动发送 ; 6 模块分析 6.16.1 参数设置和显示模块参数设置和显示模块 单击主界面中的【设置】按钮,将弹出“设置”对话框,如图 7.1 所示,可以在该 对话框中设置串口的通信参数。该命令的代码如下: void cmscommdlg:onbnclickedsetupcom() / todo: 在此添加控件通知处理程序代码 m_opencom.enablewindow(true); afxmessagebox(

17、_t(请设置通信参数并打开串口以实现通信!); cstring strstatus,strtemp; double dblbaund; int mdata,mstop; if ( (mysetupdlg.domodal()=idok) mycom=mysetupdlg.m_com+1;/求取串口编号 if(mysetupdlg.m_baudrate8) dblbaund=pow(2,(double)mysetupdlg.m_baudrate);/求取波特率 dblbaund=300*dblbaund; else switch(mysetupdlg.m_baudrate) case 8:8: d

18、blbaund=43000; break; case 9:9: dblbaund=56000; break; case 10:10: dblbaund=57600; break; case 11:11: dblbaund=115200; break; case 12:12: dblbaund=128000; break; case 13:13: dblbaund=256000; break; strstatus.format(_t(%.0f),dblbaund); mybaudrate=strstatus; switch(mysetupdlg.m_parity)/ 求取奇偶校验位 case 0

19、:0: myparity=e; break; case 1:1: myparity=m; break; case 2:2: myparity=n; break; case 3:3: myparity=o; break; case 4:4: myparity=s; break; mdata=4+mysetupdlg.m_data;/求取数据位 strstatus.format(_t(%d),mdata); mydata=strstatus; mstop=1+mysetupdlg.m_stop;/求取停止位 strstatus.format(_t(%d),mstop); mystop=strsta

20、tus; strstatus=com; strtemp.format(_t(%d),mycom); strstatus+=strtemp; strstatus+=, ; strstatus+=mybaudrate; strstatus+=bit/s, ; strstatus+=myparity; strstatus+=, ; strstatus+=mydata; strstatus+=, ; strstatus+=mystop; m_para=strstatus;/求取静态文本显示内容 updatedata(false); 6.26.2 发送数据模块发送数据模块 . 6.36.3 单击主界面中

21、的【发送】按钮,将把发送区的内容发送到串口调试助手的接收区,. 6.4 自动发送模块自动发送模块 当【自动发送】选中时,系统将自动每隔 2s 发送一次数据,如图 7.4(a)(b)所示, 程序代码如下: void cmscommdlg:ontimer(uint_ptr nidevent) / todo: 在此添加消息处理程序代码和/或调用默认值 onbnclickedsendbutton(); cdialog:ontimer(nidevent); void cmscommdlg:onbnclickedcheckautosend() / todo: 在此添加控件通知处理程序代码 m_bautos

22、end=!m_bautosend; if(m_bautosend) settimer(1,2000,null);/时间为毫秒 else killtimer(1); /取消定时 6.6.5 5 接收数据模块接收数据模块 发送方发送数据后,在接受区显示对方的发送内容,如果【十六进制显示】选中, 则将只显示十六进制数 0f,如图 7.5(a)(b)所示,该命令的代码如下: void cmscommdlg:oncommmscomm1() / todo: 在此处添加消息处理程序代码 updatedata(true); variant variant_inp; colesafearray safearra

23、y_inp; long i = = 0;0; int len; char rxdata2048; cstring tmp; switch ( (m_mscom.get_commevent() case 2:2:/表示接收缓冲区内有字符 variant_inp = = m_mscom.get_input(); safearray_inp = = variant_inp; len = = safearray_inp.getonedimsize(); for ( (i = = 0;0; i len; i+) safearray_inp.getelement(/转换为byte型数组 for ( (i

24、= = 0;0; i len; i+)/将数组转换为cstring型变量 byte bt=*(char*)(rxdata+i); /字符型 if(m_ctrlhexdisplay.getcheck() tmp.format(_t(%02x ),bt); /将字符以十六进制方式送入临时 变量tmp存放,注意这里加入一个空隔 m_recv+=tmp; /加入接收编辑框对应字符串 if(!m_ctrlhexdisplay.getcheck() rxdatai = 0; if(!m_ctrlhexdisplay.getcheck() m_recv +=+= rxdata; updatedata(fal

25、se); break; default: break; 6.6.6 6 清空接收区模块清空接收区模块 单击主界面中的【清空接收区】按钮,将清空接收区内容,提示“清空接收区内 容!” 如图 7.6 所示,该命令的代码如下: void cmscommdlg:onbnclickedclearrecv() / todo: 在此添加控件通知处理程序代码 m_recv=; updatedata(false); afxmessagebox(_t(清空接收区成功!); 6.76.7 清空发送区模块清空发送区模块 单击主界面中的【清空发送区】按钮,将清空发送区内容,提示“清空发送区内 容!” 如图 7.7 所示

26、,该命令的代码如下: void cmscommdlg:onbnclickedclearsend() / todo: 在此添加控件通知处理程序代码 m_send=; updatedata(false); afxmessagebox(_t(清空发送区成功!); 6.8 关闭串口模块关闭串口模块 单击主界面中的【关闭串口】按钮,将关闭串口,提示“串口关闭成功!” ,如图 7.8 所示,该命令的代码如下: void cmscommdlg:onbnclickedclosecom() / todo: 在此添加控件通知处理程序代码 m_mscom.put_portopen(0);/关闭串口 afxmessagebox(_t(串口关闭成功!); m_opencom.enablewindow(true);/使打开串口按钮生效 m_closecom.enablewindow(false);/使关闭串口按钮无效 m_setupcom.enablewindow(true);/使设置按钮生效 7 系统测试 7.1 测试测试 首先,直接双击 mscomm 文件夹下的 debug 子文件夹下的 mscomm.exe 运行文件; 其次,按以下步骤进行测试: (1)参数设置: 图 7.1 参数设置 (2)打开串口: 图 7.2 打开串口 (3) 发送十六进制: 图 7.3(a)十六进制发送 图 7.3(b)串口调

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论