news 2026/4/3 6:05:38

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

作者头像

张小明

前端开发工程师

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协议;普通转义适合快速验证场景。

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

------------END------------

卷,加100套!99元买4核+双千兆网的开发板

单片机将常量数据放在指定位置的小技巧

卷王?2025年瑞萨RA家族推出了10个系列MCU~

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

3PEAK思瑞浦 TPM27524Q-SO1R-S DFN3X3-8 栅极驱动器

特性 行业标准引脚配置 汽车级AEC-Q100一级认证4.5V至23V单电源电压范围 双独立通道 5A峰值源极和漏极驱动电流每个输出独立使能功能 与TTL和CMOS兼容的阈值在VDD-UVLO或输入悬空时输出保持低电平低传播延迟(典型值14纳秒)快速上升和下降时间(典型值为7ns和6ns)两个通道之间的典…

作者头像 李华
网站建设 2026/4/1 4:24:46

芯片Bond Pad(焊盘)结构深度解析

Bond Pad(中文常称“焊盘”或“键合焊盘”)是芯片与外部电路实现电气连接的核心接口,如同芯片的“通信桥梁”——其一端通过内部金属布线与芯片核心电路(如晶体管、逻辑单元)相连,另一端通过键合工艺&#…

作者头像 李华
网站建设 2026/3/29 1:05:57

uniapp+python微信小程序的健康体检预约系统

文章目录系统概述技术架构核心功能创新点应用价值系统设计与实现的思路主要技术与实现手段源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!系统概述 健康体检预约系统基于UniApp跨平台框架和Python后端技术开发,旨在为用户提供…

作者头像 李华
网站建设 2026/3/23 18:47:46

uniapp+python微信闲置二手物品置换系统卖家 多商家 微信小程序

文章目录 技术架构设计多商家功能实现核心功能模块微信小程序集成性能与安全优化扩展性考虑 系统设计与实现的思路主要技术与实现手段源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! 技术架构设计 UniappPython微信闲置二手物品置换系统…

作者头像 李华
网站建设 2026/3/23 12:13:03

uniapp+python校园外卖订单系统小程序lw

文章目录系统概述技术架构核心功能创新点应用价值系统设计与实现的思路主要技术与实现手段源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!系统概述 基于UniApp和Python的校园外卖订单系统小程序,旨在为校园师生提供便捷的外卖…

作者头像 李华
网站建设 2026/3/28 8:41:24

uniapp安卓小程序php python寓言童话小说创作APP 协同过滤

文章目录 跨平台开发框架选择后端语言选型寓言童话小说APP功能设计协同过滤算法实现数据存储与性能优化多端协同与API设计 系统设计与实现的思路主要技术与实现手段源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! 跨平台开发框架选择 Un…

作者头像 李华