一句话: 上位机和下位机之间的协议文档如果和代码不一致,联调就是灾难。本文分享一个实操方法——把 Excel 协议表逐行和代码比对,帧头、长度、通道名、偏移地址,一项一项过。15 条指令找出 7 处错误,修完全对上。
适合谁读:适合嵌入式开发者、单片机初学者及遇到类似问题的工程师
为什么要做这个
你手里有两份东西:
- 协议 Excel 表— 上位机同事给你的,写着每条命令的帧格式、字段、含义
- 固件代码— 你自己写的
protocol.c,实现这些命令
如果这两份对不上,联调的时候就会出现:
上位机:"我发了命令 5,你回复的数据格式不对" 你:"我按协议写的啊" 上位机:"你那个协议文档是第几版的?" 你:"……"在联调之前把协议和代码逐行对齐,能省掉一大半的联调时间。
方法:逐指令、逐字段比对
拿一个三列表格,对着协议文档和代码,逐条过:
| 指令 | 协议文档说 | 代码实际写 | 一致? |
|---|---|---|---|
| 命令 1 | 帧头0x73 0x74 | 0x73 0x74 | ✓ |
| 命令 1 | 数据长度 8 字节 | u8Len = 8 | ✓ |
| 命令 2 | 帧头0x73 0x74 | 0x72 0x74 | ✗ — 帧头写错 |
| 命令 3 | CH1 电流 | CH2 电流 | ✗ — 通道名张冠李戴 |
| ... | ... | ... | ... |
不要相信"差不多"——必须一个字一个字对。
实际发现的 7 类错误
1. 帧头写错
协议文档: 帧头 0x73 0x74 代码: 帧头 0x72 0x74 ↑ 敲错了少一个 bit 的区别。如果上线,上位机发的帧检查 0x73 0x74,你的代码也检查 0x72 0x74——永远对不上。
2. 数据长度不一致
协议文档: 命令 5 返回 12 字节 代码: memcpy(TxBuff, data, 10)协议说回 12 字节,代码只回了 10 字节。上位机收到了 10 字节后还在等剩下 2 字节,超时。
3. 通道名张冠李戴
协议文档: 字节 3-4 = CH1 电流值 代码注释: 字节 3-4 = CH2 电流值写代码的时候复制粘贴了上一行的注释,忘了改通道名。功能上不影响(反正都是两个字节存电流),但文档对不上,调试时一脸懵。
4. 偏移地址漏填
协议文档: 字节 5 = Flash 写入地址 [31:24] 代码: 跳过了字节 5,直接从字节 6 开始解析少解了一个字节,后面的字段全部偏移一位——整条命令解析全错。
5. 读/写标志位反了
协议文档: bit 7 = 0 读, 1 写 代码: if (cmd & 0x80) → 读操作逻辑反了。上位机发读命令,你的代码当写命令处理。
6. 校验和范围不一致
协议文档: 校验和 = 从字节 0 到字节 N-2 的累加和取反 代码: 校验和 = 从字节 0 到字节 N-1多算了一个字节。校验和永远差一个数。
7. 帧尾忘写
协议文档: 帧尾 0x0D 0x0A 代码: 只发了数据,没发帧尾上位机收不到帧尾,不知道这帧结束了——一直等。
对齐工作流
完整的操作步骤:
第 1 步:拿到最新版协议文档
找上位机同事要一份最新的 Excel 表。确认版本号、日期。旧版文档 = 浪费时间。
第 2 步:拉一个三列对比表
| 指令 | 字段 | 协议值 | 代码值 | 一致? | |:--:|------|--------|--------|:--:| | 1 | 帧头 | 0x73 0x74 | 0x73 0x74 | ✓ | | 1 | 长度 | 12 | 12 | ✓ | | 1 | 命令码 | 0x01 | 0x01 | ✓ | | 2 | 帧头 | 0x73 0x74 | 0x73 0x74 | ✓ | | 2 | 长度 | 8 | 10 | ✗ | | ... | ... | ... | ... | ... |第 3 步:逐指令过,不一致的标红
不要跳。哪怕第 14 条命令觉得"肯定对的",也要看一眼。
第 4 步:修代码,改完一条测试一条
不要攒到最后一起测——万一修 A 的时候手滑改了 B,B 本来是对的。
第 5 步:改完把 Excel 更新
你发现的错误,如果协议文档本身有错(比如帧头写错),反馈给上位机同事让他们更新文档。文档是活的,不是刻在石头上的。
总结
| 步骤 | 做什么 |
|---|---|
| 1 | 拿最新版协议文档 |
| 2 | 拉三列表,逐字段比对 |
| 3 | 不一致的全标红 |
| 4 | 修一条测一条 |
| 5 | 文档和代码一起更新 |
对齐了再联调。这 15 条指令如果不先比对,联调至少要花一上午去找"为什么不通"。现在花了 40 分钟找出了 7 个错,联调 10 分钟就跑通了。前置投入换后端效率。
有用的话点个收藏,下次调试直接用。有问题欢迎评论区交流,看到了都会回。