当前位置:文档之家› 封装串口数据通信协议的设计

封装串口数据通信协议的设计

封装串口数据通信协议的设计

摘 要: 为了提高串口数据通信的准确率、方便上层应用编程,设计了一个协议对串口数据通信协议进行封装。协议采用自定义报文格式封装串口数据帧的方式工作,利用报文应答机制保证传输正确性,该协议在线路故障出现时能有效检测并采取报文重发等措施保证数据准确传输。
关键词: 串口;通信协议;数据报;数据传输
0 引言
串口通信协议是计算机上非常通用的一种设备通信协议,串口按位(bit)发送和接收字节,可以在使用一根线发送数据的同时用另一根线接收数据[1]。利用串口进行数据传输时,串口能做到奇偶校验以确定数据是否传输正确,然而在实际的上位机和下位机的通信中,往往传输以字节为单位的数据,这样仅奇偶校验数据位并不能达到正确传输数据的目的[2],因此需要建立在串口之上的数据交换规则,即封装串口通信的协议[3]。本文设计的就是一种用数据报封装了串口数据通信的协议,它能有效检测线路状态并处理丢包等问题。它不仅能实现PC之间的数据传输,还可用于嵌入式设备的数据通信。
1 协议分层结构
为了使协议程序的设计更为合理,并且利于在各硬件系统使用,将此协议进行分层设计。由于串口通信的性质,无需过多采用面向连接来建立虚电路,因此本协议采用无连接服务[4]。协议体系结构。

2 协议的设计
本文提出的协议的设计思想是数据报的传输方式,即将上层应用提供的流式数据分割并格式化为一个个的数据报,再发送给串口进行串行传输。接收方从串口接收到的数据报经过重新拼接形成数据流再送给上层应用。为保证串行传输,每个数据报的传输中采取发送—应答—重传—失败的方式工作。协议工作前需要设置超时等待时间、数据分割长度、串口参数等参数[5-6]。
2.1 数据报格式

数据报分为报文头部和数据部两部分,其格式。报文头部由6字节组成,第1、2字节AB表示报文长度,即报文头部长度加上数据部长度;第3、4字节CD表示整个报文的校验和;第5、6字节XX表示应答ACK;第7、8字节GH表示报文序号。
数据报长度AB范围为0~65 535,所以一个报文最大为8 KB。数据部长度等于报文长度(AB)减去报文头长度(8 B)。
2.2 数据处理与报文处理
数据处理包括分割上层应用提供的数据,以及从报文还原拼接数据;报文处理包括格式化报文以提供给串口发送以及从串口读取报文、校验报文、提取数据[7]。
2.2.1 数据分割
协议从应用程序接口获取应用程序提供的数据并以流式数据写入发送方数据缓冲区;然

后以事先设定的数据分割长度取数据,长度不足的部分则全部取出,取数据指针移动相应距离。
2.2.2 报文组装
报文的组装过程如下[8]:
(1)计算取出数据的长度,填入报文第1、2字节;
(2)报文第3~6字节全部置0;
(3)计算报文序号GH;
(4)计算校验和,从第1字节开始,每两个字节为一个单元进行分割,末尾不足两字节则在其后补0,再将这些单元进行二进制反码求和,结果存在检验和字段中第3、4字节;
(5)将取出的数据接在报文头部后面,将整个报文写入报文缓冲区。
2.2.3 报文拆分
报文拆分的具体步骤如下[9]:
(1)从报文缓冲区按报文长度获取报文数据;
(2)计算校验和,方法同报文组装里的计算方法:如果校验和不为0xFFFF,则传输过程中发生差错,丢弃此报文;如果校验和为0xFFFF,取出报文长度及报文序号,计算数据部长度,取出数据[9]。
2.2.4 数据拼接
将从报文取出的数据填入接收方数据缓冲区,写数据指针移动相应距离;接收完最后一个数据后,协议将数据缓冲区中的数据提供给上层应用程序,写数据指针恢复初始值。
2.3 数据报传输过程
数据报传输情况分为考虑定时器超时和不考虑定时器超时两种,定时器超时处理应属于中断调用。
2.3.1 传输过程
数据报传输过程如下[10]:
(1)在进行数据报传输前,发送方将数据分割并装进报文,ACK置为0x0000,计算报文序号,再将报文送入报文缓冲区。
(2)开始发送时,串口按已经设定的工作方式和波特率工作,从报文缓冲区获取报文数据并发送。
(3)发送方发送完毕一个数据报后,停止发送,启动定时器计时,准备接收响应。
(4)接收方串口接收数据并填入报文缓冲区。
(5)接收方从报文缓冲区获取报文数据,进行校验:
①若接收方校验结果为正确,则取出数据;若接收的ACK=0x0011并且收到的序号等于前面一个报文的序号,则将数据覆盖到前一块数据,否则将数据填入数据缓冲区;记录报文序号,发送数据部为空、ACK=0x1111的报文。
②若接收方校验结果为错误,则丢弃数据报,发送数据部为空、ACK=0x1110的报文,通知发送方重发。
(6)接收方每次处理完数据报均初始化并启动定时器计时,刚收到数据报时关闭定时器。
(7)发送方收到响应报文,校验通过则关闭定时器,获取ACK,若ACK=0x1111,则发送下一个数据报;若ACK=0x1110,则重发当前数据报(ACK置0x0011)。如果校验不通过就丢弃此数据报,仍保持定时器计时。
(8)双方重复

以上步骤直到最后一个报文发送完毕。
(9)发送方发送最后一个报文完成后,发送数据部为空、ACK=0x0001的报文提示数据传输完毕,若此报文发送后收到重传响应,则重发此数据报(ACK仍置0x0001)[10]。
2.3.2 定时器超时处理
若发送方定时器达到发送方超时等待时间仍未收到响应报文,则重传当前数据报(ACK置0x0011),连续超时三次还没收到应答则停止发送数据报,清空报文缓冲区和数据缓冲区,并向应用程序返回通信失败[11]。若接收方定时器达到接收方超时等待时间仍未收到报文,清空报文缓冲区和数据缓冲区,关闭定时器,并向上层应用程序返回通信失败。
3 结论
本文所设计的协议封装串口通信是为了更方便和安全地传送数据,从上文可以看到,在发送大数据报时,串口的速度其实不高,而本协议若需控制在毫秒级的处理,所发数据不能超过1 192 B。报文长度字节AB范围为0~65 535,故每个报文大小为8 B~8 KB,数据部大小为0~8 184 B,所以数据分割范围为0~8 184 B[12]。故本协议更适用于小数据量传送,比如在信号采集后的数据传送等,传输一个双精度浮点数需要14 ms左右。

相关主题