新闻详情

新闻详情

首页 / 资讯中心 / 详情

【嵌入式外设精学】Day11|粘包与半包:状态机解帧

发布时间:2026/10/1 3:00:09来源:尧图网络
【嵌入式外设精学】Day11|粘包与半包:状态机解帧
【嵌入式外设精学】Day11粘包与半包状态机解帧今天解决中断一次来半个包、两个包解析器怎么写才不乱目录问题 2. 原理 3. 代码 4. 误区 5. 自测 6. 答案1. 问题把“收到多少字节”当成“一条消息”数据就会错位。2. 原理2.1 字节流 vs 报文串口给你的是一串字节不是一条条消息。解析层要从流里“抠”出报文现象含义半包一次只来帧的前半粘包一次来两帧甚至多帧错峰上次没解析完污染下次2.2 状态机四步找头 → 收长度 → 收负载 → 收校验 → 成功/丢弃 → 回到找头成功或失败后都要回到“找头”否则永久错位。2.3 不变量好解析器的标准一次只吃 1 个字节不假设“一次一帧”长度有上限防溢出校验失败立刻复位3. 代码示例#includestdint.h#includestdbool.h#includestring.h#defineHDR0xAAu#defineMAX_DATA8utypedefstruct{uint8_tcmd;uint8_tdata[MAX_DATA];}msg_t;typedefenum{ST_HEAD,ST_LEN,ST_CMD,ST_DATA,ST_SUM}st_t;typedefstruct{st_tst;uint8_tidx;uint8_tlen;uint8_tcmd;uint8_tbuf[MAX_DATA];}parser_t;voidparser_init(parser_t*p){memset(p,0,sizeof(*p));p-stST_HEAD;}staticuint8_tadd_sum(constuint8_t*d,uint32_tn){uint8_ts0;while(n--){s(uint8_t)(s*d);}returns;}/* 每收 1 字节调用返回 true 表示 out 里有一条完整消息 */boolparser_feed(parser_t*p,uint8_tb,msg_t*out){switch(p-st){caseST_HEAD:if(bHDR){p-stST_LEN;}break;caseST_LEN:if(bMAX_DATA){parser_init(p);break;}p-lenb;p-st(b0u)?ST_SUM:ST_CMD;break;caseST_CMD:p-cmdb;p-idx0;p-st(p-len0u)?ST_SUM:ST_DATA;break;caseST_DATA:p-buf[p-idx]b;if(p-idxp-len){p-stST_SUM;}break;caseST_SUM:{uint8_ts(uint8_t)(HDRp-lenp-cmd);s(uint8_t)(sadd_sum(p-buf,p-len));if(sbout!0){out-cmdp-cmd;memcpy(out-data,p-buf,p-len);parser_init(p);returntrue;}parser_init(p);break;}default:parser_init(p);break;}returnfalse;}4. 常见误区误区正解解析完不复位下一条永久错位在 ISR 里做复杂业务只入队主循环解析len 不检查缓冲区溢出用while一次性读完假设流是分片到的5. 自测连续两帧同时到状态机要怎样校验错了怎么做6. 答案处理完第一帧立即复位继续吃后面的字节。丢弃并回ST_HEAD不交给业务。作者shuifanyu标签状态机串口协议粘包
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Cursor 接入蓝湖:用 MCP 打通设计稿到代码的高效还原链路 2026/10/1 3:59:40

Cursor 接入蓝湖:用 MCP 打通设计稿到代码的高效还原链路

事情是这样的:我们前端组和设计组之间的对话,很长一段时间都是“还原了吗?”“还原了。”“这里差 2px,再改一下。”“哦,那这里呢?”……直到有一天,我把 Cursor 接到了蓝湖上,设计…

阅读更多 →
qData v1.1.1发布:动态游标同步与SQL Server 2008全面支持 2026/10/1 3:59:33

qData v1.1.1发布:动态游标同步与SQL Server 2008全面支持

1. 版本速览:qData v1.1.1 到底带来了什么先说结论:qData 数据中台开源版 v1.1.1 这次的核心看点就两个,一个是动态游标同步技术正式上线,另一个是 SQL Server 2008 的全面支持。如果前几个版本你还在纠结"老库怎么接进来、增…

阅读更多 →
棉花叶病害检测数据集977张22类:VOC转YOLO训练与调参实战 2026/10/1 3:59:33

棉花叶病害检测数据集977张22类:VOC转YOLO训练与调参实战

简介:本资源为棉花叶子病害检测数据集,面向从事农业图像识别、作物病害分类与目标检测的算法工程师、研究生及竞赛选手,可用于训练和验证YOLO或VOC格式的检测模型,解决棉花叶片病害自动识别中样本不足的问题。压缩包共约2000个文件…

阅读更多 →
基于KeyarchOS使用pgtune一键优化PostgreSQL性能调优实践指南 2026/10/1 3:59:33

基于KeyarchOS使用pgtune一键优化PostgreSQL性能调优实践指南

1. 为什么PostgreSQL调优让人头大:从参数迷宫说起1.1 PostgreSQL默认配置和实际生产需求的差距接触过PostgreSQL的人都有感受:安装完PG,默认配置可以直接跑起来,但真要放到生产环境里扛业务,不调参数基本等于裸奔。默认…

阅读更多 →
王道操作系统考研复习:总目录+思维导图高效搭建指南 2026/10/1 3:59:33

王道操作系统考研复习:总目录+思维导图高效搭建指南

每年三四月份,总会有一批刚决定考研的学弟学妹拿着一张“王道操作系统学习笔记总目录思维导图”的资源来问我:这东西到底该怎么用?操作系统在408里是最容易“看明白”却又最容易“转头就忘”的科目,它不像数据结构那样有大量代码题…

阅读更多 →
Oracle 19c多租户新增PDB全流程:从建库到扩容的实操与避坑 2026/10/1 3:59:33

Oracle 19c多租户新增PDB全流程:从建库到扩容的实操与避坑

上周接到一个需求:新项目要一套独立数据库,数据隔离是硬性要求。我手头正好有一台跑在Linux上的Oracle 19c,CDB已经在线运行,里面还挂着两个正在用的PDB。这种场景下显然没必要再装一套完整实例——Oracle 19c多租户架构本身就是为…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉