摘要设计了一种在MFC中实现与串口连续通信的简易方法,利用微软提供的MSComm控件,仿照MODBUS-RTU协议,并根据数据包之间的时间间隔T1,将间隔
串口通信适用于长距离控制与数据传输,许多单片机在内部均集成了串口通信模块,而计算机的操作系统也内嵌有对串口通信的支持。在现代各工业控制和数据传输等通信系统领域中,单片机与计算机的串口通信得到了广泛应用。因此,在Windows操作系统下实现串口通信,开发与单片机通信软件显得尤为重要。MFC(Microsoft Foundation Classes),是微软公司提供的一个类库(Class Libraries),以C++类的形式封装了Windows的API,且包含一个应用程序框架,减少了应用程序开发人员的工作量,因此基于VC++的MFC平台开发串口通信界面程序的方式深受程序员青睐。
传统串口通信软件采用两种方法处理连续传输的数据包。一种是采用固定字节长度的数据包协议,该方法灵活性差,即使传输极少字节的数据也必须使用固定长度的数据包。另一种方法是加入数据包包头,该方法必须先对接收到的每个字节进行判断,从而造成了CPU的大量浪费。本文采用微软的MSComm控件,设计了一种简便的方法,有效弥补了以上两种方法的缺陷。
1 数据包连续串口通信原理
单片机的时钟频率远小于计算机CPU,如常用单片机C8051F02频率为25 MHz,低于计算机CPU上GHz的处理速度。单片机传给上位机的数据,每个数据包均独立反映硬件对上位机的一个响应状态或硬件处理完的一个任务。因此,单片机连续传送数据包时,数据包之间存在一定的时间间隔,而每个数据包中相邻字节是连接传送的,时间间隔远小于数据包之间的间隔。
仿照MODBUS-RTU协议,利用数据包之间的时间间隔T作为是否去读写串口缓存的判断依据,其只需满足以下两个条件:(1)单独数据包自身发送时,数据包内部数据字节之间发送时间间隔小于时间T;(2)不同的数据包之间发送时间间隔>T,便可实现从串口缓存中连接读取接收到的数据包。
2 基于MFC的软件设计方案
计算机串口通信界面软件包括串口初始化、Comm事件响应、时间间隔判断、读取串口数据和数据处理,其具体流程如图1所示。
3 软件代码实现
打开VS2008软件开发平台,新建一个MFC程序,并插入一个MSComm串口控件。增加了控件响应函数,数据包时间间隔T此处暂设为20 ms。为调试方便,加入时间溢出标志m_time_out_flag变量。
m_time_out_flag=0;//时间溢出标志设为0,表明数据已处理完
为了方便测试,此处添加的数据处理函数是在一个大的编辑框中,将串口接收到的连接数据包全部显示出来。
4 软件验证与结果分析
在单片机开发板中,烧入每隔25 ms向串口发送数据包“Xidian University”的小程序,成功后连接到计算机,并打开编写的MFC串口通信软件以及单片机开发板电源,具体效果如图2所示。
设置时间间隔T为不同的值,相应地修改单片机的数据包发送时间间隔,并在不同CPU型号计算机下进行多次测试,测出结果平均值如表1所示。
从表1中可得出结论,计算机CPU的处理速度越快,数据包长度越短,时间间隔T可设的值也越小。另外,经测试,当数据处理函数变复杂时,最小时间间隔T可设的值也会相应增大。
5 结束语
文中方法,充分利用了数据包内部数据字节间发送时间间隔小,数据包之间发送时间间隔大的特点。采用微软提供的MSComm控件,在Comm事件中设置定时器,并根据计算机CPU处理速度、数据包长度、数据处理函数复杂程度,选取适当的T值。当定时器时间T溢出时,读取并处理串口缓冲区中的数据。由于是根据数据包之间发送的时间间隔T来判断数据包,所以数据包长度可不固定,也无需对每个数据字节进行判断,故有效解决了计算机与串口间的连接数据包传输处理问题。