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 0printf("************测试hdlc_send()******************\n");len = hdlc_send(data1,6);printf("********************end**********************\n\n");
#endifprintf("\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

如何解析hdlc帧7E头(帧格式分析实例)相关推荐

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

    击上方"一口Linux",选择"星标公众号" 干货福利,第一时间送达! 0. 前言 作为一名嵌入式工程师,经常需要通过UART与外设打交道,而对于串行总线来说, ...

  2. 【计算机网络】数据链路层 : 广域网 ( HDLC 协议 | HDLC 站 | HDLC 帧格式 | HDLC 帧类型 | PPP 协议 与 HDLC 协议 对比 )

    文章目录 一.HDLC 协议 二.HDLC 站 三.HDLC 帧格式 四.HDLC 帧类型 五.PPP 协议 与 HDLC 协议 对比 一.HDLC 协议 HDLC 协议 : ① 全称 : High- ...

  3. 第三章:zigbee学习笔记之物理层和mac层帧格式分析

    本文原地址:https://blog.csdn.net/tainjau/article/details/81634681 IEEE802.15.4工作组致力于无线个人区域网络(wireless per ...

  4. 关于STM32串口3的使用,接收并解析一帧数据

    关于STM32串口3的使用,接收并解析一帧数据 当stm32的串口1被使用时,我们可以使用其他串口来使用. 步骤: 串口3定义.初始化: 串口3中断服务函数(接收的一帧数据并判断是否正确): 主函数使 ...

  5. python爬虫最为核心的HTTP协议解析,及自定义协议的分析

    机器之间的协议就是机器通信的语法,只有按照这种语法发来的信息,机器之间才能相互理解内容,也可以理解为信息的一种格式. HTTP/IP协议是互联网最为重要的协议,没有HTTP/IP协议,也就没有互联跟不 ...

  6. Android JNI入门第四篇——jni头文件分析

    转载请标明出处: http://blog.csdn.net/michael1112/article/details/56666407 江东橘子的博客 一. 首先写了java文件: public cla ...

  7. dicom多帧转换_Python解析多帧dicom数据详解

    概述 pydicom是一个常用python DICOM parser.但是,没有提供解析多帧图的示例.本文结合相关函数和DICOM知识做一个简单说明. DICOM多帧数据存储 DICOM标准中关于多帧 ...

  8. linux内核中链表代码分析---list.h头文件分析(二)【转】

    转自:http://blog.chinaunix.net/uid-30254565-id-5637598.html linux内核中链表代码分析---list.h头文件分析(二) 16年2月28日16 ...

  9. Java 网络实例三(获取URL响应头的日期信息、获取URL响应头信息、解析URL、ServerSocket和Socket通信实例)

    获取 URL响应头的日期信息 以下实例演示了如何使用 HttpURLConnection 的 httpCon.getDate() 方法来获取 URL响应头的日期信息: import java.net. ...

最新文章

  1. selenium之 chromedriver与chrome版本映射表(更新至v2.33)
  2. primeNG DataTable中Templating ng-template标签报错
  3. 「权威发布」2019年电赛最全各类题目细节问题解答汇总
  4. 70条程序员编程的专业名言,你认可几条?
  5. .Net Core下基于Emit的打造AOP
  6. python修改文件内容,不需要read,write多个动作。
  7. 二进制法生成1-n的子集
  8. Elasticsearch整理笔记(五)
  9. 汽车辐射监测系统-Qt开发
  10. mycat集群_HA高可用架构_验证高可用---MyCat分布式数据库集群架构工作笔记0030
  11. 数字信号处理思维导图
  12. iOS开发各种证书详解
  13. java线段的平移和旋转,几何变换(旋转、缩放、平移)
  14. linux下ad键盘驱动,led、键盘、ADC驱动程序
  15. 20170416郑州市轻工业学院ACM校赛
  16. 什么是二值图像、什么是灰度图像、什么是彩色图像?区别?
  17. C++ 实现Handler机制
  18. 大规模数据存储技术之Erasure Code(EC编码)
  19. cf 1A Theatre Square
  20. React(六) —— redux

热门文章

  1. layui跳转添加选项卡_IE9,特定于站点的浏览器,以及将自己的跳转列表项添加到固定选项卡...
  2. JS中数组与对象的互相转换
  3. CentOS 使用yum安装 pip
  4. 如何使用图片生成荣誉证书
  5. 软件工程基础课-结对项目-地铁
  6. Excel真的是三维地图可视化制作最好的选择吗?
  7. 苏格拉底和失恋者的对话
  8. 空间域图像增强:卷积和空间域滤波
  9. VLSI数字信号处理系统——第五章展开
  10. Android APP Camera2应用(04)录像保存视频流程