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. ansible(1)---师傅领进门

    背景 在企业里,运维需要配合开发进行产品上架,说白了就是把写好的代码上服务器.那么,就会出现这样的问题:需要运维人员配置好系统,配置好环境,配置好网络,配置好程序,配置好所有所有的依赖环境.     ...

  2. 《DNK210使用指南 -CanMV版 V1.0》第一章 本书学习方法

    第一章 本书学习方法 1)实验平台:正点原子DNK210开发板 2)章节摘自[正点原子]DNK210使用指南 - CanMV版 V1.0 3)购买链接:https://detail.tmall.com ...

  3. 【论文阅读】BEVFormer: Learning Bird's-Eye-View Representation from Multi-Camera Images via Spatiotemporal

    论文题目:BEVFormer: Learning Bird's-Eye-View Representation from Multi-Camera Images via Spatiotemporal ...

  4. CF1860C 题解

    显然是一个博弈论题,考虑 dp. 定义状态 \(dp_i\) 表示先手走到 \(i\) 之后是否有必胜策略,不难发现以下几点: 若走到 \(i\) 之后无路可走,那么就必败. 若走到 \(i\) 之后 ...

  5. 2023年台州市初赛Misc

    2023年台州市初赛Misc 这是神马 冰蝎流量,找到key <?php @error_reporting(0); session_start(); $key="144a6b22963 ...

  6. cf edu 133 D

    题意 思路 根据题意,最开始可以想到一个二维的dp状态 用dp[i][j]表示跳了j次刚好到i的方案数 如果是跳了j次,那么这次应该要被k+j-1整除才行 那么这样状态转移就是 dp[i][j] = ...

  7. python爬取网站图片保存到本地文件夹

    爬取的网站 https://wallpaperscraft.com/catalog/anime 爬取代码 # 导包 import os import requests import parsel fr ...

  8. 3.1 Y86-64指令集体系结构

    程序员可见的状态 这里的程序员即可以是用汇编代码写程序的人,也可以是产生机器级代码的编译器.程序员可见的状态如下,有15个程序寄存器(%rax,%rbx等),三个一位的条件(ZF,OF,SF) ,程序 ...

  9. SELECT *问题

    1.mysql拿到一条命令,会去解析命令.优化查询,然后去存储引擎执行查找.SELECT * 语句取出表中的所有字段,会解析更多的 对象,字段,权限,属性相关,不论该字段的数据对调用的应用程序是否有用 ...

  10. MySQL_数据库命名规范及约定

    操作规范 如无说明,建表时一律采用innodb引擎: 如无说明,数据库表编码集(utf8,utf8_bin)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf ...