7E头解析的那些事儿(帧格式分析实例)
时间:2021-10-29 16:07:44
手机看文章
扫描二维码
随时随地手机看文章
[导读]0.前言作为一名嵌入式工程师,经常需要通过UART与外设打交道,而对于串行总线来说,往往我们必须要进行帧同步。通常的做法是把信令包含在2个0x7E的中间。除此之外还有HDLC、PPP等协议也会到有此应用场景。那么如何从这些数据帧中提取有效数据呢?本文通过一个简单的实例给大家详细讲...
0. 前言
作为一名嵌入式工程师,经常需要通过UART与外设打交道,而对于串行总线来说,往往我们必须要进行帧同步。通常的做法是把信令包含在2个0x7E的中间。除此之外还有HDLC、PPP等协议也会到有此应用场景。那么如何从这些数据帧中提取有效数据呢?本文通过一个简单的实例给大家详细讲述如何从帧中提取有效的协议信令。1. 帧格式要求
首先我们明确下帧提取的一些要求:- (1)把信息字段中出现的每一个0x7E字节转变为2字节序列(0x7D,0x5E)。
- (2)若信息字段中出现一个0x7D的字节(即出现了和转义字符一样的比特组合),则把转义字符0x7D转变为2字节序列(0x7D,0x5D)。
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 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("************测试hdlc_send()******************\n");
len = hdlc_send(data1,6);
printf("********************end**********************\n\n");
#endif
printf("\n************测试hdlc_rcv_frm()******************\n");
hdlc_rcv_frm(data1,6);
hdlc_rcv_frm(data2,6);
hdlc_rcv_frm(data3,8);
hdlc_rcv_frm(data4,6);
hdlc_rcv_frm(data5,6);
hdlc_rcv_frm(data6,6);
printf("********************end**************************\n");
}
运行结果如下:注意
本代码仍然有一些bug,暂时没有修改,所以实际项目慎用。小心数组越界啊!完整代码链接:链接:https://pan.baidu.com/s/1rPEDC3erLpPRH0OnkfNH_A提取码:wzxq版权申明:内容来源网络,版权归原创者所有。除非无法确认,都会标明作者及出处,如有侵权,烦请告知,我们会立即删除并致歉!