7E头解析的那些事儿(帧格式分析实例)
IT科技类资讯 2025-10-08 13:19:16
0
0. 前言
作为一名嵌入式工程师,解析经常需要通过UART与外设打交道,事儿式分而对于串行总线来说,帧格往往我们必须要进行帧同步。析实通常的解析做法是把信令包含在2个0x7E的中间。
除此之外还有HDLC、事儿式分PPP等协议也会到有此应用场景。帧格
那么如何从这些数据帧中提取有效数据呢?析实
本文通过一个简单的实例给大家详细讲述如何从帧中提取有效的协议信令。
1. 帧格式要求
首先我们明确下帧提取的解析一些要求:
(1)把信息字段中出现的高防服务器每一个0x7E字节转变为2字节序列(0x7D,0x5E)。事儿式分
(2)若信息字段中出现一个0x7D的帧格字节(即出现了和转义字符一样的比特组合),则把转义字符0x7D转变为2字节序列(0x7D,析实0x5D)。解析
举例:一个PPP帧的事儿式分数据部分:
7D 5E FE 27 7D 5D 7D 5D 65 7D 5E那么实际上真正的数据是
7E FE 27 7D 7D 65转换图解:
同样的,如果要发送数据,帧格则反过来。源码库
2. 设计
底层传上来的每一短帧长度不固定 底层传上来的每一短帧7e头位置不固定,可能有可能没有,可能有1个7e也可能有2个7e 默认每一帧数据最多2个7e比如:我们从底层收上来的原始数据帧格式如下:
那么我们要能够提取两个7e之间的协议数据帧,同时还原帧中的所有的7e。
很显然我们希望最终解析后结果如下:
7e 0f 0e 30 27 1c 00 27 1c 01 27 1c 02 7e 00 29 7e 7e 11 73 7e 7e 00 27 1c 01 27 1c 02 7e 00 29 7e帧解析详细设计流程图
3.代码
不上代码的就是耍流氓
首先看下如果下发数据帧,如何将所有的站群服务器7e和7d做替换:函数hdlc_send(char * data,UINT8 len)实现如下:
int hdlc_rcv_frm(UINT8 *data,int len)实现如下
测试代码如下:
int main() { int len; char data1[6]={ 0x7e,0xf,0xe,0x30,0x27,0x1c}; char data2[6]={ 0x0,0x27,0x1c,0x1,0x27,0x1c}; char data3[8]={ 0x2,0x7d,0x5e,0x0,0x29,0x7e,0x0,0x7e}; char data4[6]={ 0x11,0x73,0x7e,0x30,0x27,0x7e}; char data5[6]={ 0x0,0x27,0x1c,0x1,0x27,0x1c}; char data6[6]={ 0x2,0x7d,0x5e,0x0,0x29,0x7e}; #if 0 printf("