微波EDA网,见证研发工程师的成长!
首页 > 射频和无线通信 > 射频无线通信文库 > 一种基于状态机的串口通信协议的设计与实现

一种基于状态机的串口通信协议的设计与实现

时间:05-18 来源:互联网 点击:

而达到状态改变的目的,最终完成一个数据包的接收与校验。

2.2 串口通信状态图

串口通信协议中,发送数据包时一般不需引入状态机,这主要是为提高发送速率和简化编程模型而考虑的。本协议中主要针对数据接收过程建立状态机。数据接收状态图如图2所示。

串口通信的数据接收过程如下:当未开始接收数据包或发现数据传输出错时,系统进入空闲状态;当数接收到数据包0x55(起始标志)时,变为收到起始标志状态,如果收到的数据不为0x55,系统继续保持空闲状态;进入收到起始标志状态后,新接收到的任何数据将被当作数据包中命令与附加数据的总字节数(记为LEN),系统进入收到数据长度状态;继续接收新的数据,直至接到新收到的数据总字节数达到LEN +2,进入检验结束标志状态;这时可以检验结束标志是否为0x56,如果是,说明传输正确,否则传输出错,出错后应查找接收缓冲区中本数据包的起始标志后有无其它起始标志,如果没有发现起始标志,系统应进入空闲状态,否则应直接进入接收到起始标志状态,这样可提高系统容错能力,方便系统从错误中恢复。检验结柬标志正确后,进入数据校验状态;校验结果如果正确,数据包接收完成,否则说明传输出错,系统进入空闲状态。

3 协议实现

下位机采用ATMEL公司的AVR系列单片机ATmega168作为其核心控制单元;上位机软件采用Delphi 7.0编写,Delphi 7.0是Borland公司开发的基于Windows平台的面向对象的快速应用程序开发工具。本协议上位机程序采用Delphi开发,主要考虑到Delphi易于实现多线程编程。另外,Delphi开发程序的简单、高效,也是上位机软件选择其作为开发工具的重要原因。

串口通信协议包括发送与接收两部分。在本系统中,下位机负责发送数据,上位机负责接收数据,而另一种情况:下位机接收、上位机发送,其处理方法与前面一种相似。因此,这里仅介绍下位机发送数据、上位机负责接收数据的实现。

下位机串口通信发送程序由于不考虑状态机,实现较为简单,其示例代码如下:

上位机软件中,当接收到数据时,串口控件会触发一个事件,在事件处理代码中应及时将收到的数据存入接收冲区,同时不应该把串口通信协议接收部分的代码放置在此事件中,否则后面到来的数据可能因为前面先到的数据没有及时处理完毕而被冲掉,导致数据丢失。因此,在上位机软件运行时,应该启动一个Windows线程,用于不断检测接收缓冲区是否为空,不为空时则对缓冲中的数据进行处理,创建一个名为TBufferThread的线程类:

线程类创建好后,应具体编写TBufferThread线程类成员函数Execute的处理过程,其算法流程图如图3所示。

依据流程图,编写代码如下:


数据包的接收进度依据于状态指示变量sp。当数据接收顺利时,sp的变化将会引导完成一个数据包的接收过程,这样处理可以简化编程的模型,使协议易于实现;数据包接收过程中,一旦发现数据传输出错,立即将sp置为0(空闲状态),也就是状态复位,使系统进入准备接收下一个数据包的状态,这样可提高通信过程的可靠性及容错能力。

为检验测试串通信协议的合理性及可靠性,将其应用到某称重仪表的上位机通信中,其上位机程序主界面如图4所示。程序主界面的点阵字体显示的是由下位机传送的质量数据,而正中间显示的是由下位机上传的A/D数据形成的曲线,最下方显示的是对接收的数据处理的状态指示。经过大量测试表明,本串口通信协议设计合理,可靠性较高。

4 结论

文中主要介绍串口通信协议的设计与实现,其中包括数据包格式的定义、通信状态机的设计以及协议的实现,并将此协议应用到某称重仪表的上位机通信中。串口通信中引入状态机方法,便于解决帧同步问题,使协议易于实现,同时增加了系统的稳定性与可靠性。因此,可广泛用于各类仪器仪表、工业控制领域中,具有一定的实用价值。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top