纸飞机串口调试助手是一款面向嵌入式开发和自动化测试场景的串口调试工具,它比较实用的一项能力是支持自定义 HEX 协议。所谓自定义 HEX 协议,指的是调试工具不再把“HEX 发送”限定成一段裸的十六进制文本,而是允许开发者按照设备端固件手册里的帧结构,把帧头、命令字、数据长度、数据域、校验字节和帧尾拆成模板字段。调试时选中一条命令并填写参数,工具自动完成拼帧、校验和发送。
实际开发串口通信产品时,反复出现在面前的问题并不是“不会用串口助手”,而是“协议栈不匹配、校验算法不一致、日志不好回溯”。普通串口调试助手只能承担“发原始字节、显示原始字节”的角色,一旦协议稍微复杂一点,调试效率立刻下降。自定义 HEX 协议模板的价值,就是把嵌入在文档里的协议规则转成工具可识别的配置,让开发者在调试阶段更关注业务逻辑而不是位运算。
下面从协议设计、工具配置、手动调试、代码验证和问题排查几个维度展开。适合两类读者:一类是刚接触嵌入式串口通信,正在学习如何和设备交互的初学者;另一类是已经在用串口调试助手,但厌倦手工拼帧、希望把协议模板沉淀下来的工程师。
1. 为什么串口调试助手需要自定义 HEX 协议
1.1 文本指令和 HEX 协议到底差在哪里
串口通信的本质是字节流,它可以承载 ASCII 文本,也可以承载二进制数据。对于调试来说,这两种形式的差异很大。
文本指令的可读性好,例如向一个 AT 指令模组发送:
AT+STATUS\r\n对应的 HEX 表示是:
41 54 2B 53 54 41 54 55 53 0D 0A设备端按文本协议解析时,先按行读取,再做字符串匹配,最后执行指令。文本方式方便人阅读和日志分析,但解析效率偏低,而且当数据域包含大量二进制变量(温度、电压、坐标等)时,把数值转成十进制字符串再拼接,既浪费带宽又容易出错。
HEX 协议则不关心字符编码,它直接按固定偏移或固定帧结构读取字节。例如一个简单的状态查询帧:
AA 55 01 00 01 0D 0A设备收到后按字节位置解析:前两个字节是帧头,第三个字节是命令字,第四个字节是数据长度,第五个字节是校验,最后两个字节是帧尾。整个过程不需要字符串比较,适合对实时性和稳定性要求高的工业场景。
| 对比项 | 文本协议 | HEX 协议 |
|---|---|---|
| 可读性 | 高,直接看字符串 | 低,需要对照文档解析 |
| 解析效率 | 较低,需要字符串匹配 | 较高,按字节偏移读取 |
| 二进制数据传输 | 需要编码转换 | 可直接传输 |
| 调试难度 | 低,所见即所得 | 较高,需要拼帧和校验 |
| 适用设备 | 模块、模组、语音芯片等 | 传感器、工控、伺服、医疗设备等 |
当设备协议文档写的是 HEX 帧格式时,用文本模式调试没有意义,必须进入 HEX 模式,并且最好有协议模板帮助拼帧。
1.2 固定协议工具在真实设备调试中的局限性
普通的“HEX 发送”输入框只解决了一个问题:把十六进制文本转成字节发出去。但它有三个明显局限。
第一,拼帧工作量大。设备协议通常包含帧头、命令字、长度、数据、校验、帧尾,其中校验需要计算。如果每次都在脑子里或计算器里算累加和、CRC,调试一条指令还好,连续调试几十条命令会非常耗时。
第二,容易出错。手工拼帧常见错误包括:帧头写错、数据长度没有随数据域变化、校验多算或少算一个字节、漏掉帧尾。这些错误在日志里很难发现,因为接收方只回一个无效帧,或者完全不响应。
第三,协议升级后维护成本高。设备固件升级后,命令字或数据域变化,调试工具里的协议逻辑需要同步更新。如果工具不支持模板化配置,每次升级都要重新核对原始字节。
自定义 HEX 协议模板正是围绕这些问题设计的。它把“协议定义”和“调试操作”分离:协议变更时改模板,日常调试只操作命令和参数。
1.3 自定义 HEX 协议模板的设计思路
纸飞机串口调试助手的自定义协议,本质是一个可编辑的帧生成器。设计时主要有几步:
- 确定帧头、帧尾等固定字段。
- 确定命令字列表,以及每个命令对应的数据域格式。
- 确定校验方式,比如累加和、CRC8、CRC16-MODBUS。
- 在工具中建立模板,填充这些字段。
- 调试时选择命令,输入数据域内容,工具自动生成完整帧。
这样一个模板可以复用到同产品的多台设备、多次现场调试。不同设备协议不同,可以建立多套模板,切换协议时只要切换到对应模板即可。
2. 跑通串口调试前,先把参数和显示模式对齐
很多自定义协议调试失败,问题不在协议本身,而在最基本的串口参数没对齐。
2.1 串口参数检查清单
打开纸飞机串口调试助手之前,先确认四样东西:串口号、波特率、数据位、停止位、校验位。设备端固件一般固定成一组参数,常见组合是 115200-8-N-1。意思是波特率 115200,数据位 8,无校验,1 位停止位。
| 参数 | 常见值 | 说明 |
|---|---|---|
| 波特率 | 9600 / 115200 / 460800 | 设备手册确认,必须和固件一致 |
| 数据位 | 8 | 大多数设备为 8 位 |
| 停止位 | 1 | 少数老设备为 2 |
| 校验位 | None | 常见为无校验,也有 Even / Odd |
| 流控 | 关闭 | 调试阶段一般不使用 RTS/CTS 硬件流控 |
检查清单:
- 正确选择串口号,尤其 USB 转串口模块插入新 USB 口后 COM 号可能变化。
- 确认没有其他软件占用该串口,日志或监控程序会抢占端口。
- 确认波特率与设备端一致,不一致时通常表现为乱码或无响应。
- 确认数据位、停止位、校验位和“发送新行”等附加选项符合协议要求。
注意:检查串口参数时,不要只盯着波特率。数据位、停止位、校验位任何一个不一致,收到的数据都可能偏移或乱码,而且这类问题在日志里非常隐蔽。
2.2 文本模式与 HEX 模式的切换
纸飞机串口调试助手通常会在发送区和接收区分别提供文本/HEX 模式切换。这一点特别容易误解。
HEX 模式下,发送输入框里看到的“AA 55”是十六进制文本,实际发送到串口的是两个字节0xAA 0x55。如果同时在发送格式里勾选“按 ASCII 发送”,同样的界面会变成发送字符AA两个字母加空格再加55两个字母,这时设备端收到的完全是另一串字节。
接收区也类似。文本模式下,设备返回的0x41 0x54会显示成字符串AT;HEX 模式下会显示成41 54。自定义 HEX 协议调试时,收发两侧都应切成 HEX 显示,否则很难核对字节。
大多数串口调试助手会在输入框旁边显示当前模式,或者在发送按钮附近提供下拉选择。建议在发送之前先确认模式标识,而不是凭记忆判断。
2.3 打开串口前的检查点
按顺序检查:
- 在设备管理器的“端口 (COM 和 LPT)”里找到目标 COM 号。
- 确认 USB 转串口驱动已安装,设备插拔后 COM 号是否变化。
- 关闭可能占用该串口的其他程序。
- 在工具中选择正确参数,点击打开串口,观察状态栏是否显示已打开。
学习环境里可以先用 USB 转 TTL 模块把 TX 和 RX 短接做回环测试,不接设备也能验证工具本身收发是否正常。生产现场则建议先用