ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

7E头的那些事儿(帧格式分析实例)

2021-10-27 08:31:07  阅读:267  来源: 互联网

标签:7E 27 rcv 7e frm hdlc char 实例 格式


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. 设计

  1. 底层传上来的每一短帧长度不固定
  2. 底层传上来的每一短帧7e头位置不固定,可能有可能没有,可能有1个7e也可能有2个7e
  3. 默认每一帧数据最多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("************测试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

标签:7E,27,rcv,7e,frm,hdlc,char,实例,格式
来源: https://www.cnblogs.com/yikoulinux/p/15468856.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有