news 2026/4/23 13:49:28

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

作者头像

张小明

前端开发工程师

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/4/23 11:36:28

3PEAK思瑞浦 TP1561AL1-S5TR-S SOT23-5 运算放大器

特性 供电电压:2.5伏至6伏低供电电流:每通道600微安(典型值) 轨到轨输入和输出 带宽:6MHz(典型值) 斜率:4.5V/us(典型值) 优异的EMI抑制性能偏移电压:士3mV(最大值) 偏移电压温度漂移:1uV/C(典型值)低噪声:在1kHz时为19nV/vHz(典型值)高输出能力:100毫安(典型值)工作温度范围:-…

作者头像 李华
网站建设 2026/4/11 1:45:38

还是智能的悲剧:达沃斯论坛赫拉利的观点分析

以下是针对2026年达沃斯论坛中尤瓦尔赫拉利(Yuval Noah Harari)关于人工智能的核心观点的深度分析,结合其著作 《人类简史》与 《智人之上》中的思想框架,从文明预警视角展开:一、AI的“代理化”与人类控制权的消解赫拉…

作者头像 李华
网站建设 2026/4/23 12:20:41

uniapp+python微信小程序的在线问诊挂号开药系统

文章目录系统概述技术架构核心功能安全与合规应用场景扩展性系统设计与实现的思路主要技术与实现手段源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!系统概述 基于UniApp和Python的微信小程序在线问诊挂号开药系统,整合了移动…

作者头像 李华
网站建设 2026/4/23 10:44:22

Java实习模拟面试之Java基础篇(1-8题):高频核心考点深度解析

Java实习模拟面试之Java基础篇(1-8题):高频核心考点深度解析适合人群:准备Java后端实习/校招的同学 关键词:Java基础、面试八股文、 vs equals、引用类型、泛型擦除、反射优化、序列化 字数:约3500字 | 阅读…

作者头像 李华
网站建设 2026/4/23 10:45:55

【2026】 LLM 大模型系统学习指南 (35)

Diffusion Model:从噪声到图像的生成魔法 —— 核心原理与入门实操 Diffusion Model(扩散模型)是当前最主流的生成模型之一,核心逻辑是 “逐步加噪再逐步去噪”—— 先把清晰图像变成纯噪声,再训练模型学习 “反向去噪…

作者头像 李华
网站建设 2026/4/23 12:24:44

【SSM毕设源码分享】基于ssm+vue的怀旧小筑客栈管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华