在通讯的数据传输中,我们往往都是要应用一个通讯协议,比如http协议,TCP协议,Modbus协议等。对于数据流传输中的,帧首与帧尾的区分就非常重要。帧首定位错误,整帧数据无法解析,通讯就出现丢帧,延时增大等等异常现象。今天分享一下转义符在数据流中的帧首判定的应用。
帧首肯定也是一个字节(或多个字节),而数据中往往也存在着与”帧首“相同的字节序列。这时,如果数据中的”帧首“字节序列当成了帧首,那么,帧的解析一定是错误的。在错误的地方解析帧格式肯定是错误的嘛!
转义符(Escape Character)的应用就可以在一定程序上解决此问题,让帧首只会在帧首的位置出现。
转义符原理转义符通常通过在特殊字符前添加一个特定的转义字符来实现。当编码时检测到特殊字符时,自动在前面插入转义字符,接收端再进行相应的解码处理。例如,我们选定帧头(如0x55)字节,转义符为0x1B。并定义如下转义规则:
原始数据中的帧首0x55 => 转义为0x1B 0xE1;
原始数据中的转义符0x1B => 转义为0x1B 0xD2;
假设要发送的原始数据如下:
0x44 0x55 0x01 0x88 0x1B 0xAA
0x44 => 0x44
0x55 => 0x1B 0xE1
0x01 => 0x01
0x88 => 0x88
0x1B => 0x1B 0xD2
0xAA => 0xAA
这里可以看到在原始数据中有帧首字节和转义符字节的数据,所以,我们必须将其通过转义符转义,以去除对帧首0x55字节的干扰。这样,编码后的数据帧如下:
55 44 1B E1 01 88 1B D2 AA
0x55: 帧首标识符,去除
0x44:保留
0x1B 0xE1: => 0x55
0x01:保留
0x88:保留
0x1B 0xD2:=> 0x1B
0xAA:保留
最后,解码后的数据即为
0x44 0x55 0x01 0x88 0x1B 0xAA
转义符可以用来标识帧首与帧尾,防止误判数据中的帧首或帧尾,但其也会增加帧数据长度。
通讯协议中的帧首帧尾判断还有很多种,总有一款适合你。关注我,继续为大家分享!
我要赚赏金
