TECHNICAL GUIDE
电子秤串口通讯协议解析_ 连续发送稳定应答三种模式与主流秤机协议适配 | 上海耀罡电子
同一台秤,换一种发送模式,数据格式完全不一样。本文用真实数据帧逐字节拆解,帮你避开「读到了但解析不出来」的坑。
基础参数:先把这几项对齐
五项必须两端一致
串口通讯出问题的第一排查项永远是这五项:波特率、数据位、停止位、校验位、流控。
| 项目 | 常见配置 | 说明 |
|---|---|---|
| 波特率 | 4800 / 9600 / 19200 / 115200 | 两端必须完全一致 |
| 数据位 | 8 位(兼容 ASCII) | 少数设备支持 7 位 |
| 停止位 | 1 位 | 固定为 1 |
| 校验位 | 无校验(None) | 部分型号支持奇/偶校验 |
| 流控 | 无 | 秤机一般不用硬件流控 |
| 帧格式 | n, 8, 1 | 最常见的标准配置 |
为什么双方都是 9600 仍然不通
一个反直觉但很常见的情况:**波特率一致但数据位或校验位不一致,依然全是乱码。
因为接收端按自己的配置去切分比特流,起始位对上了但每字符的位数切错了,解出来的就是完全无意义的字节。
排查时用 stty -F /dev/ttyS1 -a 读出实际配置,再去查秤机说明书里的出厂默认值,逐项核对而不是只看波特率。POS 类秤机有时会用奇偶校验,这是最容易漏的一项。
三种发送模式的本质差异
为什么不发送 / 连续 / 稳定 / 应答
电子秤的串口输出有四种模式,这个设计直接对应不同的业务场景:
| 模式 | 行为 | 典型用途 |
|---|---|---|
| 不发送 | 只在收到指令时回复 | 省电的待机场景 |
| 连续发送 | 不停地把当前重量推出来 | 实时监控、动态显示 |
| 稳定发送 | 重量变化小于阈值后才发送 | 避免读数跳动干扰 |
| 应答发送 | 收到查询指令才回一帧 | 主从通信、精确读取 |
连续发送:简单但吵
连续模式下,秤机会以固定周期不停推数据。好处是主机随时能拿到最新值,缺点是数据量大且会持续占用串口带宽。
如果主控同时还要跑别的串口设备,一条持续输出的串口会挤占中断处理时间,这是嵌入式设备里很典型的「一个口把整机拖慢」的问题。
应对方式是用子口独立配置的串口扩展芯片,把秤机放在专门的子口上,让主控只在该口有数据时处理,不影响其他通道。
稳定发送:更实用
稳定模式只在重量变化小于预设阈值时才发送一帧。对收银、计价这类「人放上去才要看数字」的场景,这是最合理的模式——读数稳定不跳,总线负载也低。
代价是主控拿不到严格意义上的「实时」值,需要自己加超时判断(比如超过 N 毫秒没收到就认为秤已归零或异常)。
应答发送:最可控
应答模式是主控发一帧查询、秤机回一帧数据。这种方式时序完全由主控掌握,最适合多设备共存的系统。
缺点是主控必须实现超时与重传逻辑,并且要保证帧格式与秤机一致——不同厂商的应答指令差别很大,有的用字符指令,有的用二进制码。
数据帧逐字节拆解
一个真实的大华计价秤帧
以大华计价秤的连续发送模式为例,实际收到的字节流是这样的:
20 31 30 32 30 20 20 39 38 37 36 35 20 20 31 30 30 37 34 30 0A 0D
逐段拆开看:
| 字节 | ASCII | 含义 |
|---|---|---|
20 31 30 32 30 |
1 0 2 0 | 净重 1.020 kg |
20 20 |
(两个空格) | 间隔位 |
39 38 37 36 35 |
987.65 | 单价 |
20 20 |
(两个空格) | 间隔位 |
31 30 30 37 34 30 |
1007.40 | 总价 |
0A 0D |
CR LF | 协议尾 |
两个必须注意的设计约定
第一,不亮的位用空格(0x20)填充。这是 ASCII 数字串的常规做法——定长字段靠「固定宽度 + 空格填充」来对齐,而不是靠分隔符。解析器如果直接 trim 掉空格再按位置取字段,在价格字段变短时就会错位。
第二,协议尾固定是 0A 0D(CRLF)。这是帧同步的锚点。解析器应该以 CRLF 作为帧结束标志,而不是按固定长度硬截——不同模式下字段长度不同(连续模式 21 字节,稳定模式只有 7 字节),按长度截断必然在某些模式下出错。
净重位数的特别说明
注意上面的净重是 5 位。在称重模块的实际实现里,净重字段会按秤的量程与分度值来确定宽度,可能是 5 位、6 位或 7 位,并且要处理前导空格与小数点位置不固定的情况。
大华协议在净重前会带一个标志位(G 表示毛重、N 表示净重),应答模式里还会带 KG 单位标识,例如 02 20 20 31 2E 30 32 30 20 4B 47 表示净重 1.020 KG。解析时必须逐字段按位取,不能假设固定偏移。
主流秤机协议特点对照
各家差异在哪
| 秤机品牌 | 协议特点 | 适配要点 |
|---|---|---|
| 大华 | 定长 ASCII + 空格填充 + CRLF 结尾,有连续/稳定/应答三模式 | 按位取字段,以 CRLF 定帧 |
| 顶尖 | ASCII 输出,常带毛重/净重标志与单位 | 注意标志位与单位位 |
| 迪宝 | 常见格式含状态位与多组固定字段 | 按状态位判断数据有效性 |
| 七华 | 多种可选格式,含金额与累计字段 | 需先确认出厂设定的格式编号 |
| 耀华等通用仪表 | 常见单行 ASCII 重量值 | 相对简单,注意小数点位数 |
为什么必须做多协议适配
现实情况是:同一款收银秤的软件,要能对接不同品牌的秤机。客户手里可能已有存量秤机,或者不同门店采购了不同批次的秤。
如果方案只支持一种协议,客户的设备就被绑死了。所以协议适配层的设计目标应该是「配置化」而不是「硬编码」——把帧长、字段位置、校验方式做成可配置参数,新增一种秤机时只需要增加一份配置,不需要改主流程代码。
我们的称重模块程序(C0.05.04)就是按这个思路做的,兼容顶尖、大华、迪宝、七华等主流秤机通讯格式。
秤机侧的设置入口
很多协议问题不在程序侧,而在秤机没有配成正确的模式。
以大华计价秤为例,需要通过按键组合进入通讯设置(清除键 + 数字键序列),再选择 00 不发送 / 01 连续发送 / 02 稳定发送 / 03 应答发送,最后确认保存。
一个实用的建议是:在产品的说明书或丝印上,直接印上进入通讯设置的操作步骤和当前模式。现场调试时能省下大量扯皮时间。
解析器的设计要点
推荐的接收结构
解析器建议用「状态机 + 环形缓冲」的写法,而不是每次 read 就假定能拿到一整帧:
c
/* 环形缓冲区,接收线程写入,解析线程按 CRLF 切帧 */
typedef struct {
uint8_t buf[256];
uint16_t head, tail;
} ring_buf_t;
/* 解析流程:
1. 累加接收字节到环形缓冲
2. 扫描 CRLF,定位完整帧
3. 提取帧(去掉 CRLF)
4. 按协议配置解析字段
5. 校验有效性后更新当前重量
*/
这样做的三个好处:一次 read 可能只收到半帧(重试即可),也可能一次收到多帧(循环取即可);字节级的丢包不会导致整帧错位;解析逻辑与接收逻辑解耦,测试时可以手工喂帧字符串。
别忘了有效性判断
解析出数字不等于数据有效。秤机会输出负值(表示反向)、超量程错误、以及无效字符(如秤机开机自检时的乱码)。
建议在解析层同时输出三个状态:当前重量、有效标志、错误码。上层业务根据有效标志决定是显示还是提示,比直接显示一个可能错误的数字安全得多。
与三键式人机交互的配合
在带显示的收银秤上,称重数据与按键操作是同一个交互流程的一部分。
我们的称重模块方案采用三键式人机交互设计,把去皮、置零、确认等操作与称重数据解析统一在同一个状态机里管理,避免称重读取与按键响应互相打断。这类交互的一致性,直接影响收银员的手感。
常见故障与排查
按现象定位
| 现象 | 最可能的原因 | 排查动作 |
|---|---|---|
| 完全收不到数据 | 秤机设为「不发送」模式 | 回秤机改模式设置 |
| 收到全是乱码 | 波特率/校验位不匹配 | stty -a 逐项核对 |
| 数据能收但字段错乱 | 协议模式判断错误 | 确认是连续还是稳定模式 |
| 数据长度忽长忽短 | 解析器按固定长度截断 | 改为按 CRLF 定帧 |
| 价格字段偶尔错位 | 未处理空格填充 | 定长取位,不要先 trim |
| 时好时坏 | 共地不良或屏蔽未单端接地 | 检查接地,缩短线长 |
| 高速时丢帧 | 串口缓冲区溢出 | 加流控或降低波特率 |
一个容易忽略的硬件前提
RS232 必须共地。秤机与主控之间如果只有 TX/RX 两根线而没有 GND,在实验室桌面环境下可能「碰巧能通」,拿到现场换个机箱、换个电源就完全不通。
这是典型的「实验室能跑、现场跑不通」的故障。规范做法是三线制:TX、RX、GND 必须都接。如果距离远或两端电源系统不同,则需要用隔离型 RS232 收发器或直接改用 RS485。
调试的最小闭环
准备一个串口调试助手(PC 端),按秤机出厂配置连上:
1. 用调试助手连上秤机串口,波特率/校验与说明书一致
2. 把秤机设为「连续发送」
3. 看调试助手里有没有数据滚动
4. 有数据 → 记录原始字节,转给主控侧做解析对照
5. 无数据 → 换线、换电脑口、排查秤机设置
第 4 步很关键:先用 PC 确认秤机确实在发、发的是什么格式,再拿这个字节序列去测主控。否则两边同时调,很容易陷入「到底是秤机没发还是我解析错了」的僵局。
常见问题
电子秤串口通讯的默认参数是什么?
最常见的是 9600bps、8 数据位、1 停止位、无校验(n,8,1),但也有 4800、19200、115200 的配置。关键是要逐项核对波特率、数据位、停止位、校验位,不能只看波特率——数据位或校验位不一致同样全是乱码。
连续发送和稳定发送该选哪个?
看业务需求。连续发送适合实时监控,但会持续占用串口带宽并产生大量数据;稳定发送在重量变化小于阈值时才发,适合收银、计价这类场景,读数不跳、负载也低。多设备共存的系统里,应答模式时序最可控,但主控要实现超时重传。
为什么读到的数据长度每次都不一样?
因为不同发送模式的帧格式不同。连续模式可能是 21 字节(净重+单价+总价),稳定模式可能只有 7 字节,应答模式又是另一种结构。解析器如果按固定长度截断必然出错,正确做法是以协议尾 0A 0D(CRLF)作为帧结束标志。
支持哪些秤机的通讯格式?
我们的称重模块程序(C0.05.04)兼容顶尖、大华、迪宝、七华等主流秤机通讯格式,量程覆盖 300g 到 300kg,多档分度值与双量程配置可选。如果你的秤机是其他品牌或特殊格式,可以把协议样本发给我们评估适配。
秤机连不上,先查什么?
第一件事是回秤机确认发送模式——很多「连不上」其实是秤机设成了「不发送」模式。第二件事是确认 RS232 的 GND 是否接了,实验室能通现场不通通常就是这根地线的问题。第三件事才是核对波特率等参数。建议先用 PC 串口调试助手连一次,确认秤机确实在发数据。