基于VB的串行通信

时间:2022-10-27 08:30:48

基于VB的串行通信

【摘要】针对串行通信中一帧数据接收的完整性,提出时间片的设计思路,基于VB6.0中的MSComm控件,实现了PC机与单片机之间串行通信数据帧的完整接收。该方法可提高串行数据的处理效率和准确率,并且可对串行通信协议不确定的数据帧进行完整接收。

【关键词】串行通信;一帧数据;时间片

1.引言

在计算机网络以及工业控制系统中,串口通信具有硬件简单、操作方便、成本低和容易实现等优点而得到广泛应用。但实际应用中,串口软件易出现数据阻塞、丢失等问题[1]。为此,诸多学者提出了具体的解决方案,如采用基于消息方式的多线程编程思想,有效地解决了大量数据的连续存储和实时显示占用大量系统资源的问题,提高了数据的吞吐量和应用程序的实时性和可靠性[2];采用一种基于事件驱动和双缓冲区的串行通信设计方案,解决了低速串行通信与系统高实时性要求之间的矛盾,并在此基础上实现了一个实时多任务委托等[3]。在考虑系统的资源利用率和实时性的同时,保证串行数据完整接收是串行通信设计中非常关键的一个环节,不完整的数据会影响数据的处理和存储,浪费系统资源和降低系统的实时性。本文通过改进串行通信数据链路层数据帧的接收方法,保证一帧串行数据的完整接收。

2.一帧串行数据不完整接收的原因分析

物理层的硬件不稳定会造成串口一帧串行数据接收的不完整,数据链路层的软件设计不合理同样会导致一帧串行数据接收的不完整[4]。目前,在数据链路层的软件设计中,对串行数据的接收处理主要有两种方法:

(1)只要有接收中断,就将接收到的数据存到接收缓冲区;

(2)采用特殊字符作为接收结束的标志。

第(1)种方法无法判断缓冲区中的数据是一帧数据还是多帧数据的累加,给后续的数据解析带来不便;对于第(2)种方法,由于串行数据中可能存在与特殊字符一样的数据,从而可能导致一帧数据接收不完整而丢失部分数据。为了实现一帧串行数据的完整接收,本文提出“时间片”的设计思路,无需采用特殊字符,即可保证一帧串行数据的完整接收,方便后续的数据解析。

3.基于时间片的串行数据接收方法

3.1 时间片的概念

串行通信有两种基本通信方式,即同步通信和异步通信。在异步串行通信中,数据是一个字符一个字符(一帧)地传输,每个字符一位一位地传输。一个字符由四部分组成:起始位、数据位、奇偶校验位和停止位构成。

每一串帧的数据格式如图1所示,传输一个字符时,总是以“起始位”开始,以“停止位”结束,字符之间没有固定的时间间隔,停止位后面是不定长的空闲位。在发送间隙,即空闲时,通信总线处于高电平,每一个字符的传送都以低电平开始。

图1 异步通信的数据帧格式

如图1所示,一帧数据最终是一位一位传送,导致接收往往不是一次性完成的,而是不均匀不流畅的,其中存在空白间隔,多次接收完成的[5],而两帧数据帧与帧之间有一段无数据收发的“静噪”时间[6],据此定义一个“时间片”,其时长介于一帧数据中的空白间隔和两帧数据之间的“静噪”时间,并用此“时间片”来判定一帧数据的接收是否完成。

3.2 时间片时长的确定

时间片时长的选取,应根据具体的设备和波特率来调整。若通信波特率为B,字符格式为:1个起始位、8个数据位、无检验位、1个停止位共10位,则收发一个数据所需的时间T=10/B秒。一般地,当大于2T 的时间没接收到新的数据,便可认为一帧数据接收结束[6]。对波特率为1200~9600bps的情况,1200bps的波特率最小则“静噪”时间最大,约为2*10/1200=16.7ms,所以对于波特率为1200~9600bps这个时间可取20ms,即大于20ms 的“静噪”时间便可认为一帧数据接收完毕。

3.3 串行通信的实现方法

图2 串行接收数据流程图

采用VB6.0中的MSComm控件,为了兼容ASCII编码,Unicode编码和GB编码等,采用Byte数组进行数据接收,以便编码和解析。在此基础上,利用时间片的设计思路来完善串行通信的数据帧接收。

具体实现是,在接收到一批数据时,重新启动等待时间片,并将新一批数据与前一批数据累加,每次有新的数据中断接收,就重新启动等待时间片,如此循环,直到时间片结束而无数据到达,表示数据接收完成,流程如图2所示。

本文通过定时器Timer来实现等待的时间片,命名为TimerReceive,即Timer-Receive.Interval=200(可根据实际自由调整)。由于串口接收数据缓冲区是累加方式,当数据发生错误,容易导致缓冲区堆积,不利于数据的处理,因此,本文通过另一个定时器Timer来实现数据的清空,命名为TimerClear,即TimerClear.Interval=20*1000(可根据实际自由调整),保证一定数据处理的效率性。

4.比较分析

不采用“时间片”的串行接收方法适合用于串行通信帧的帧长已知或者有特定的结束界定符,所以串行通信协议必须是确定的,但在大多数情况,设备的供应商并不提供与数据传输接口相关的技术资料。特别是许多国外进口的设备仪器之间的串行通信不附带应有的技术资料[7]。因此想对这些设备进行二次开发或自行编制数据处理程序就必须对数据进行监听接收分离剖析,此时不采用“时间片”的串行接收方法就不适合了。

基于时间片的串行数据接收方法,采用时间作为数据接收完成的判断,主要优点在于不受结束界定符限制,在两帧数据发送的间隔大于20ms的情况下可有效地判断一帧数据的接收完成。因此在通信协议未知的情况下可利用“时间片”的串行接收方法,对数据进行监听截取分离,为后续的协议剖析和破解提供前提。

基于时间片的串行数据接收方法也存在着不足,当两帧数据的时间间隔比较短时,对时间片时长的设定比较困难,此时基于时间片的串行数据接收方法就不适合了。为了避免两帧数据的时间间隔过短,解决的方法是采用一问一答的通信机制。

5.结束语

本文对Windows环境下通过VB6. 0程序使用 MSComm串行通信进行编程,采用时间片的设计思路,保证了串行一帧数据接收的完整性,实现PC机与单片机之间的动态数据交换,提高了串行通信的准确性、实时性和可靠性,方便了协议的解析。

参考文献

[1]钱永林.RS-232串口实时监控软件设计中若干问题的解决方法[J].江西电力职业技术学院学报,2004(04):61-64.

[2]王建新,严骏,曾拥华等.MSComm和多线程在数据采集系统中的应用[J].计算机应用与软件,2006(04):31-33.

[3]李灵波,孙明海,葛宁.基于串口管理的嵌入式委托实时性设计[J].微计算机信息,2005(16):89-91.

[4]李佳玉,员春欣.现场总线控制系统信息传输完整性的研究[J].上海大学学报(自然科学版),2001(05):112-114.

[5]赵宗红,谭德荣.基于MSComm控件的发动机运行监控系统串行通信研究[J].自动化信息,2009(05):44-46.

[6]程来星,胡明钦,张英波.基于VB的计算机串口通信的应用研究[J].无锡职业技术学院学报,2011,2(10):58-61.

[7]陈文建,谢家纯,徐军,易波.基于单片机和CPLD的串行通信帧协议转换系统[J].计算机应用,2003(12):43-46.

[8]赵炯,熊肖磊,周奇才.串行数据传输协议的剖析[J].计算机工程,2004(05):23-25.

[9]章辉,叶建芳,叶建威.基于MSComm控件串口通信的实现[J].电子测量技术,2011(04):126-129.

作者简介:吴燕(1986―),女,江西上饶人,助教,现供职于江西科技学院信息工程学院,主要从事电子与通信技术的研究与教学工作。

上一篇:基于单片机仿真平台的数字电压表设计 下一篇:网络购物对城市交通量影响的文献综述