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头的那些事儿(帧格式分析实例)的更多相关文章

  1. Oracle dbms_lock.sleep()存储过程使用技巧-场景-分析-实例

    <Oracle dbms_lock.sleep()存储过程使用技巧>-场景-分析-实例 摘要:今天是2014年3月10日,北京,雾霾,下午组织相关部门开会.会议的结尾一名开发工程师找到了我 ...

  2. ELK 日志分析实例

    ELK 日志分析实例一.ELK-web日志分析二.ELK-MySQL 慢查询日志分析三.ELK-SSH登陆日志分析四.ELK-vsftpd 日志分析 一.ELK-web日志分析 通过logstash ...

  3. 利用Python进行异常值分析实例代码

    利用Python进行异常值分析实例代码 异常值是指样本中的个别值,也称为离群点,其数值明显偏离其余的观测值.常用检测方法3σ原则和箱型图.其中,3σ原则只适用服从正态分布的数据.在3σ原则下,异常值被 ...

  4. php开发面试题---游戏面向对象设计与分析实例

    php开发面试题---游戏面向对象设计与分析实例 一.总结 一句话总结: 不要光空想,多看几个实例就知道自己的游戏该怎么设计了 根据实例去理解面向对象编程的的六大原则 1.英雄种类分别有:战士.法师. ...

  5. SSH框架总结(环境搭建+框架分析+实例源码下载)

    一.SSH框架简介 SSH是struts+spring+hibernate集成的web应用程序开源框架. Struts:用来控制的,核心控制器是Controller. Spring:对Struts和H ...

  6. PHPMYWIND4.6.6前台Refer头注入+后台另类getshell分析

    下载链接 https://share.weiyun.com/b060b59eaa564d729a9347a580b7e4f2 Refer头注入 全局过滤函数如下 function _RunMagicQ ...

  7. 纯js时钟特效详细代码分析实例教程

    电子时钟是网上常见的功能,在学习date对象和定时器功能时,来完成一个电子时钟的制作是不错的选择.学习本教程之前,读者需要具备html和css技能,同时需要有简单的javascript基础. 先准备一 ...

  8. 【pyQuery分析实例】分析体育网冠军联盟比赛成绩

    目标地址:http://www.espncricinfo.com/champions-league-twenty20-2012/engine/match/574265.html liz@nb-liz: ...

  9. SQL技术内幕-13 SQL优化方法论之分析实例级别的等待

    优化方法论的第一步是在实例级别上找出什么类型的等待占用了大部分的等待时间,这可以通过查询动态管理图(DMV,dynamic management view)sys.dm_os_wait_stats 运 ...

  10. 深刻:截获windows的消息并分析实例(DefWindowProc),以WM_NCHITTEST举例(Windows下每一个鼠标消息都是由 WM_NCHITTEST 消息产生的,这个消息的参数包含了鼠标位置的信息)

    1,回调函数工作机制 回调函数由操作系统自动调用,回调函数的返回值当然也是返回给操作系统了. 2,截获操作系统发出的消息,截获到后,将另外一个消息返回给操作系统,已达到欺骗操作系统的目的. 下面还是以 ...

随机推荐

  1. STM32 CubeMX 学习:004-PWM

    背景 上一讲,我们介绍了 STM32 CubeMX 学习:定时器 ,并示范了如何使用定时器来定时.这一讲我们来试试PWM(Pulse Width Modulation, 脉冲宽度调制),这是利用微处理 ...

  2. 面试官:你了解git cherry-pick吗?

    事情要从一次不规范的代码开发开始说起 背景故事 时间 2024年某个风平浪静的周五晚上 地点 中国,北京,西二旗,某互联网大厂会议室 人物 小杰,小A,小B,老K 对话 老K:昨天提交的代码被测试打回 ...

  3. 嵌入式HLS 案例开发步骤分享——基于Zynq-7010/20工业开发板(1)

    目 录 前 言 3 1 HLS 开发流程说明 5 1.1 HLS 工程导入 5 1.2 编译与仿真 6 1.3 综合 8 1.4 IP 核封装 10 1.5 IP 核测试 14 前 言 本文主要介绍 ...

  4. Express手稿

  5. C# 日期帮助类

    using System; using System.Data; namespace Erp.Ship.Tool { [Serializable] public enum DateInterval { ...

  6. Vue3 之 reactive、ref、toRef、toRefs 使用与区别,源码分析详细注释

    目录 reactive.ref.toRef.toRefs 使用与区别 reactive ref 作用及用法 toRef 作用及用法 toRefs 作用及用法 ref,toRef,toRefs 源码实现 ...

  7. [oeasy]python0071_字符串类型_str_string_下标运算符_中括号

    回忆上次内容 上次 分辨了 静态类型 语言 动态类型 语言   python 属于 对类型要求 没有那么严格的 动态类型 语言   对 初学者很友好 不过很多时候 也容易 弄不清变量类型   直接 修 ...

  8. 手写数字识别-使用TensorFlow构建和训练一个简单的神经网络

    下面是一个具体的Python代码示例,展示如何使用TensorFlow实现一个简单的神经网络来解决手写数字识别问题(使用MNIST数据集).以下是一个完整的Python代码示例,展示如何使用Tenso ...

  9. 单细胞测序最好的教程(九): 细胞类型自动注释|发表在Science的注释算法

    作者按 本章节主要讲解了基于大模型的自动注释方法,包括CellTypist(发表在Science)和MetaTiME(发表在Nature communication),一个通用,一个泛癌专用.本教程首 ...

  10. Java8 Stream流使用

    Java8 Stream 流式编程 一.Lambda表达式 Lambda表达式也可以称为闭包,它是推动Java8发布的最重要新特性,lambda允许把函数作为一个方法参数传递给方法. 在Java8之前 ...