串口通讯数据处理算法分析与实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

串口通讯数据处理算法分析与实现

【摘要】本文介绍了串口通讯数据接收处理的一般方法。该方法利用循环FIFO缓冲区,获取串口数据,并根据状态转移法对通讯报文进行分析,从而获得符合协议要求的有效报文。文章通过实例验证了状态转移法分析串口通讯数据的有效性,为实际的工程应用提供了一定的指导。

【关键词】循环缓冲区;串口通讯数据处理;状态转移法

1.应用背景

在目前很多的工程化控制应用中,大部分采用了PC机和多台单片机构成的主从系统。单片机主要进行数据采集,处理现场信号,驱动执行机构;PC机则通过对单片机进行集中管理,完成信息显示,数据运算并做出决策以分配任务。PC 机与单片机之间则需通过通讯方式完成数据交互,在众多通讯接口中,串口通讯应用比较普遍。

串口通讯方式有三种:RS232、RS422和RS485;RS-232是串行数据接口标准,最初都是由电子工业协会(EIA)制订并发布的,RS-232在1962年发布,命名为EIA-232-E,作为工业标准,以保证不同厂家产品之间的兼容。RS-422由RS-232发展而来,它是为弥补RS-232的不足而提出的。为改进RS-232通信距离短、速率低的缺点,RS-422定义了一种平衡通信接口,将传输速率提高到10Mb/s,传输距离延长到4000英尺(速率低于100kb/s时),并允许在一条平衡总线上连接最多10个接收器。RS-422是一种单机发送、多机接收的单向、平衡传输规范,被命名为TIA/EIA-422-A标准。为扩展应用范围,EIA又于1983年在RS-422基础上制定了RS-485标准,增加了多点、双向通信能力,即允许多个发送器连接到同一条总线上,同时增加了发送器的驱动能力和冲突保护特性,扩展了总线共模范围,后命名为TIA/EIA-485-A标准。由于EIA提出的建议标准都是以“RS”作为前缀,所以在通讯工业领域,仍然习惯将上述标准以RS作前缀称谓。

串口通讯是按照字节流的方式来进行的,即每中断一次,表明成功传送或者接收一个字节。

2.通讯协议

要进行数据通讯,那么通讯双方必须遵循一定格式的协议,这样,通讯双方才能够相互理解从对方所接收过来的数据。

串口通讯协议一般包含这样几个域:帧头、用户数据和帧尾。为保证数据的有效性,一般加强了帧头和帧尾,帧头包含前导码、帧长度和帧号,有的增加了发方地址和收方地址,有的通讯协议将帧长度放在帧号的后面;帧尾主要是整个数据域与帧头校验的结果,类型有CRC检验、奇偶检验或异或偶校验等。有的

协议帧尾也采用了固定的数据,甚至没有帧尾。

表1 串口通讯协议一般格式

前导码帧长度帧号数据域校验

帧头用户数据帧尾

同时通讯协议还需定义各个域的长度和每一个bit的确切的含义。

3.循环FIFO缓冲区

在通信程序中,经常使用环形缓冲区作为数据结构来存放通信中发送和接收的数据。环形缓冲区是一个先进先出(FIFO)的循环缓冲区,可以向通信程序提供对缓冲区的互斥访问。环形缓冲区通常有一个读指针和一个写指针。读指针指向环形缓冲区中可读的数据,写指针指向环形缓冲区中可写的缓冲区。通过移动读指针和写指针就可以实现缓冲区的数据读取和写入。在通常情况下,环形缓冲区的读数据仅仅会影响读指针,而写数据仅仅会影响写指针。

进行串口数据接收和发送一般也采用具有先进先出功能的FIFO循环缓冲区,如图1所示:

Tail

0 1 2 3 4 5 6 7 …… SIZE-1

Head

图1 FIFO循环缓冲区示意图

从图中可以看出,先进先出功能的FIFO缓冲区须定义一个大小为SIZE的缓冲区,存放数据,Tail指针表示该缓冲区中接收到的有效数据位置,表示写入的数据位置;Head指针表示该缓冲区中已经处理的有效数据位置,表示读出的数据位置;初始化时,Head指针和Tail指针都指到0的位置;当串口接收到数据存放到缓冲区后,Tail就加1,当Tail大于SIZE-1时,将Tail等于0,数据接收时,线性缓冲区变成一个回环;当系统从缓冲区取出一个数据进行分析,Head就加1,当Head大于SIZE-1时,将Head等于0,数据分析时,线性缓冲区也变成一个回环;依据这种方法,可以看出,数据先到的,数据先分析,建立了先进先出功能的FIFO循环缓冲区。

根据上述说明,可以使用如下结构体来定义FIFO缓冲区:

Typedef Struct Buffer_t{

Int Head;

Int Tail;

Char data[SIZE];

}Buffer;

这个结构体很简单,Tail表示写入的数据位置,Head表示读出的数据位置,data用来存放数据。在对Head和Tail修改时,需要对SIZE取模,防止溢出。SIZE一般根据串口采用的波特率,数据流量和计算机的处理速度来决定大小。

4.缓冲区数据的操作

根据FIFO的方式实现缓冲区的初始化、写入和读出的操作时,需要注意以下几点:

1)缓冲区的有效数据长度

缓冲区的有效数据长度表示在缓冲区中存在的没有及时处理的数据长度;可以这样计算:(Tail +SIZE- Head)%SIZE。

2)缓冲区的可以写入数据长度

缓冲区的可以写入数据长度表示在当前缓冲区中还能写入的数据长度;可以这样计算:SIZE-(Tail +SIZE- Head)%SIZE。

3)缓冲区空和满的判断条件

当Head和Tail相等的时候,缓冲区空,而当缓冲区中已经写入了SIZE-1个有效数据时,缓冲区满。4)写入和读出的策略

当读取或者写入缓冲区时,需要检查缓冲区中的数据或者空间是否足够。在读取时,如果没有足够的数据,是读取已有的数据还是不读取任何数据,而在写入时,如果空间不够,是部分写入还是不写入任何数据,这取决于软件开发人员的应用程序采用的策略。一般情况下,在空间不够时,可以不做任何操作。当出现上述情况,留给上层的程序去处理。在实际应用中,如果读取和写入的程序设计的合理,缓冲区的大小合适,一般是不会出现写入失败的情况的。

5.串口数据的分析

使用循环缓冲区,可以非常方便的实现对串口数据的分析,而要完成协议的各个域的严格检查,实现对部分含有错误域的包和不完整的包的完美过滤,以及对混乱数据中正确包准确无误的抽取,还须对FIFO缓冲区重新定义,具体情况

相关文档
最新文档