news 2026/4/18 11:01:29

串口通信协议中如果一帧的帧头和数据一样,你们用什么方案解决?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
串口通信协议中如果一帧的帧头和数据一样,你们用什么方案解决?

在串口通信中,若帧头字节(比如0xFA)和数据段中的字节完全一致,从机极易误将数据当成帧头,导致解析错位。以下是3种可落地的解决方法,结合具体例子拆解,新手也能快速理解:

一、转义法:给特殊字节“做标记”(最通用)

核心思路

选定帧头/帧尾(如0xFA),先遍历原始数据,将数据中所有和帧头/转义符重复的字节“转义”成特殊组合,确保数据段中不再出现帧头;接收端再通过“反转义”还原原始数据,从根源区分帧头和数据。

实战例子(以帧头0xFA、转义符0xFB为例)

1. 定义转义规则
  • 原始数据中的0xFA(帧头)→ 转义为0xFB 0x01

  • 原始数据中的0xFB(转义符本身)→ 转义为0xFB 0x02

  • 转义后手动在帧尾添加0xFA作为帧结束标记。

2. 发送端转义过程

假设要发送的原始数据:0xAA 0xFA 0x55 0xFB 0x01 0x88(含帧头0xFA和转义符0xFB)。 遍历转义后:

  • 0xAA→ 无需转义,保留;

  • 0xFA→ 转义为0xFB 0x01

  • 0x55→ 保留;

  • 0xFB→ 转义为0xFB 0x02

  • 0x01→ 保留;

  • 0x88→ 保留;

  • 帧尾添加0xFA作为结束标记。

最终发送的完整帧:0xAA 0xFB 0x01 0x55 0xFB 0x02 0x01 0x88 0xFA

3. 接收端反转义过程

接收端收到上述帧后,先找到帧尾0xFA(确认一帧结束),再遍历数据段反转义:

  • 遇到0xFB 0x01→ 还原为0xFA

  • 遇到0xFB 0x02→ 还原为0xFB

  • 普通字节直接保留。

反转义后还原原始数据:0xAA 0xFA 0x55 0xFB 0x01 0x88,完美区分了数据中的0xFA和帧尾的0xFA

注意点

  • 缺点:若数据中0xFA/0xFB出现频繁,转义后数据长度会“膨胀”(比如1个0xFA变成2个字节);

  • 优化:选业务数据中出现概率极低的字节做帧头/转义符(比如0x7D/0x55),减少转义次数。

二、COBS协议:用“距离字节”消除特殊边界(无数据膨胀)

核心思路

COBS(一致开销字节填充)是一种无膨胀的转义算法:选定一个“特殊字节”(如0x00),通过“距离字节”标记到下一个特殊字节的长度,消除数据中所有特殊字节;接收端以特殊字节为帧尾,按距离字节还原数据,避免特殊字节(帧边界)和数据重复。

实战例子(以特殊字节0x00为例)

1. 发送端COBS编码过程

假设要发送的原始数据:0xAA 0x55 0x00 0x11 0x22 0x33(含特殊字节0x00)。 编码规则:

  • 第一个字节为“距离字节”,表示“从距离字节的下一个字节开始,到下一个0x00的字节数”;

  • 若直到0xFF个字节都没0x00,距离字节填0xFF,并在第0xFF位新增距离字节。

具体编码步骤:

  1. 原始数据前加“距离字节”:从第一个字节0xAA开始,到0x00共3个字节(0xAA0x550x00),因此距离字节填0x03

  2. 跳过原始数据中的0x00,从0x11开始继续编码:0x110x220x33后无0x00,距离字节填0x04(包含自身到末尾的4个字节);

  3. 帧尾添加0x00作为结束标记。

最终编码后发送的帧:0x03 0xAA 0x55 0x04 0x11 0x22 0x33 0x00(数据中无0x00,仅帧尾有)。

2. 接收端COBS解码过程
  1. 接收端收到0x00后,确认一帧结束;

  2. 读取第一个距离字节0x03:表示从下一字节开始,取3个字节(0xAA0x55),并在第3位补回0x00

  3. 读取下一个距离字节0x04:表示从下一字节开始,取3个字节(0x110x220x33)(距离字节0x04表示“到末尾无0x00,取0x04-1个字节”);

  4. 拼接还原原始数据:0xAA 0x55 0x00 0x11 0x22 0x33

优势

无数据膨胀(仅增加1个距离字节),适合对带宽敏感的场景;缺点是编码/解码逻辑比普通转义稍复杂。

三、魔数帧头+长度+校验:最简单易实现(工业级常用)

核心思路

用“多字节魔数”做帧头(比如0xDE 0xAD 0xBE 0xEF或字符ZYNB),利用“多字节组合在数据中出现的概率极低”的特点,减少误判;再通过长度字段限定数据范围,最后用校验值验证整帧合法性,无需复杂转义。

实战例子(以魔数帧头0xDE 0xAD 0xBE 0xEF为例)

1. 定义帧结构

字段

字节数

说明

魔数帧头

4

0xDE 0xAD 0xBE 0xEF

(唯一标识)

数据长度

1

后续数据段的字节数

数据段

N

实际要发送的业务数据

CRC16校验

2

对“数据长度+数据段”的校验值

2. 发送端封装过程

假设要发送的业务数据:0xFA 0x55 0xAA(含单字节0xFA,易和单字节帧头混淆,但和4字节魔数无冲突)。 封装步骤:

  1. 加魔数帧头:0xDE 0xAD 0xBE 0xEF

  2. 加数据长度:数据段共3字节,填0x03

  3. 加数据段:0xFA 0x55 0xAA

  4. 计算CRC16:对0x03 0xFA 0x55 0xAA计算得0x1234(示例值),填0x12 0x34

最终发送的完整帧:0xDE 0xAD 0xBE 0xEF 0x03 0xFA 0x55 0xAA 0x12 0x34

3. 接收端解析过程
  1. 接收端持续搜索0xDE 0xAD 0xBE 0xEF:由于4字节组合在数据中几乎不会出现,搜到即判定为帧头;

  2. 读取后续1字节长度0x03,按长度读取3字节数据段0xFA 0x55 0xAA

  3. 读取最后2字节CRC160x12 0x34,重新计算0x03 0xFA 0x55 0xAA的CRC16,若和接收值一致,说明帧合法;

  4. 即使数据段中有0xFA,也因“按长度读取”+“CRC校验”,不会误判为帧头。

优势

实现最简单(无需转义),工业场景(如工控、物联网)中最常用;缺点是若极端情况下数据段恰好出现魔数帧头,会导致解析错误(概率极低,可通过重传/应答机制兜底)。

总结

方法

核心逻辑

优点

缺点

适用场景

普通转义

转义特殊字节,消除数据中的帧头

逻辑简单,易调试

数据可能膨胀

小数据量、低带宽要求

COBS协议

距离字节标记特殊字节位置

无数据膨胀,效率高

编码解码稍复杂

大数据量、带宽敏感场景

魔数+长度+校验

多字节帧头+长度限定+校验

实现最简单,工业常用

极端情况有误判风险

绝大多数串口通信场景

实际开发中,优先选“魔数帧头+长度+CRC16”(够用且易维护);若对数据膨胀敏感,再选COBS协议;普通转义适合快速验证场景。

结论,在项目实战中,我目前选择的是第三种方案,大家选用哪种方案,可以在评论区说出来。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 13:26:10

MICRONE微盟 ME6232A33M3G SOT-3 线性稳压器(LDO)

特性 最大输出电流:400毫安 (ViN 4.3V,Vour 3.3V)压差电压:110mVI0UT100mA (FME6232C33) 工作电压范围:1.8V~6.0V 输出电压范围:1.2V-5.0V 高精度:土1% 低静态电流:1.4uA(典型值) 待机电流:0uA(典型值) 高纹波抑制:70dB1kHz(FME6232C33)内置温度保护和电流限制保护

作者头像 李华
网站建设 2026/4/18 8:46:31

uniapp+python微信小程序的医院食堂患者在线订餐的实现

文章目录技术架构设计核心功能模块数据交互流程性能优化方案系统设计与实现的思路主要技术与实现手段源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!技术架构设计 采用Uniapp框架开发微信小程序前端,实现跨平台兼容性。后端使…

作者头像 李华
网站建设 2026/4/18 8:36:25

uniapp+python智能泊车自动停车预约系统 小程序lw

文章目录摘要内容技术实现要点应用价值系统设计与实现的思路主要技术与实现手段源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!摘要内容 基于UniApp和Python的智能泊车自动停车预约系统小程序旨在解决城市停车难问题,通过技术…

作者头像 李华
网站建设 2026/4/18 8:42:28

uniapp+python移动课程教学辅助平台微信小程序lw

文章目录 技术架构与实现方案核心功能模块数据处理与安全创新点与优化方向应用场景示例 系统设计与实现的思路主要技术与实现手段源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! 技术架构与实现方案 Uniapp结合Python开发的移动课程教学…

作者头像 李华
网站建设 2026/4/18 7:26:36

aiohttp爬取带登录态的异步请求

在网络爬虫开发中,针对需要登录验证的目标网站,传统同步爬虫(如 requests)在处理高并发请求时效率受限,而 aiohttp 作为 Python 原生的异步 HTTP 客户端 / 服务端框架,能通过异步 IO 模型大幅提升爬取效率。…

作者头像 李华
网站建设 2026/4/18 1:42:28

多商户酒店预订小程序系统全新升级,打造一站式订房平台

温馨提示:文末有资源获取方式 在数字化转型浪潮中,酒店行业对高效、自主的线上预订渠道需求日益迫切。我们为您带来一款经过重磅升级的多商户酒店预订小程序源码系统,旨在帮助创业者、开发者及中小型平台快速构建功能强大的酒店预订服务平台。…

作者头像 李华