在数据传输时,总是存在丢包、分包、误包的情况。针对这一问题,则必须引进一套数据通信协议,来保证数据的完整性与准确性。
通常,针对丢包、误包问题都会采用数据长度和校验码比对的方式来判断一包数据的准确性。针对分包问题,则采用报文头、报文尾的方式(即采用某两个特定的值作为一包的数据开始和结尾的标志),但采用这种方法来标记要保证数据中不会有与报文头、尾相同的字符,这便又涉及到了数据转义。
如下为自己总结的一个简单的数据通信协议,可用于串口、网络等通信,供大家参考。
一、数据传输格式
位置 | 长度(Byte) | 定义 | 说明 |
0 | 1 | 报文头 | 报文头,固定值0x5B,即字符’[’ |
1 | 2 | 数据长度 | 数据体的长度(传输的数据实际长度) |
3 | X | 数据体 | 传输的数据 |
3+X | 1 | 校验位 | XOR从数据长度到数据体的异或值 |
4+X | 1 | 报文尾 | 报文结束,固定值0x5D,即字符’]’ |
二、报文转义
除报文头和报文尾外,其它数据域出现0x5B、0x5C或0x5D时,进行如下报文转义(0x5C后面只能跟0x00、0x01、0x02,其它值为非法)
转义前 | 转义后 |
0x5B | 0x5C + 0x01 |
0x5C | 0x5C + 0x00 |
0x5D | 0x5C + 0x02 |
三、数据处理流程
发送数据前处理流程:数据体->计算数据体长度->计算校验位->数据转义->添加报文头及报文尾
接收数据后处理流程:去除报文头及报文尾->数据反转义->判断数据长度及校验位->获得数据体
四、接收数据时的处理方法
1、遇到报文头开始记录数据,并将后续数据存入缓冲区,否则丢弃数据。
2、遇到报文头时先清空缓冲区的数据,再开始记录数据。
3、遇到报文尾认为一包数据结束,对缓冲区中的数据进行长度判断、数据校验等后续处理,进而使用。