第四课 · 实战:用串口调试助手读取称重变送器

2026-11-04
  • 1

第四课 · 实战:用串口调试助手读取称重变送器

前三课讲了串口原理、Modbus RTU 协议和称重传感器的标定原理。这一课全部落地:只用一个 USB 转 RS485 模块和免费的串口调试助手,亲手读出变送器里的重量值,再顺手把秤清零。

>

全课围绕一句话展开——只要懂这串代码:01 03 00 00 00 03 05 CB,Modbus 就入门了。

1. 准备与接线

需要的硬件只有两样:

  • USB 转 RS485 模块(十几块钱,电脑插上就多出一个 COM 口)
  • RS485 称重变送器(本系列统一用 SJ101CX)

接线只有两根线,遵循 A 接 A、B 接 B:

接线示意

接好后打开设备管理器确认 COM 口号,打开串口调试助手,选择对应 COM 口,参数按变送器出厂默认设置:

参数值
波特率9600
数据位8
校验位无
停止位1

这四个参数必须和变送器完全一致,否则收到的是乱码或干脆没有应答。


2. 寄存器表:构造报文的"地图"

发报文之前先查手册里的寄存器表,这是整个实战最重要的一张表:

寄存器表
协议地址内容说明
0 ~ 1重量32 位有符号数,占两个寄存器
2精度小数位数,比如 2 表示两位小数
4置零写 1 执行清零(去皮)

两个关键点:

  1. 重量是 32 位的,横跨地址 0 和 1 两个寄存器。16 位寄存器最大只能存 65535,工业称重远远不够,所以要用两个拼成 32 位。
  2. 要"顺便"把精度也读出来,就要一次读 3 个寄存器(地址 0 开始,数量 3)。

3. 构造读取报文:01 03 00 00 00 03 05 CB

一帧 RTU 报文 = 地址 + 功能码 + 数据 + CRC。逐字节拆开这帧请求:

完整请求报文
字节值含义
101从站地址(变送器拨码设的站号 1)
203功能码:读保持寄存器
3-400 00起始地址 0(重量寄存器的开头)
5-600 03寄存器数量 3 个(重量 2 个 + 精度 1 个)
7-805 CBCRC16 校验(低位在前)

CRC 不能手算也不能背,它是对前 6 个字节做 CRC16 算法得出的两个字节的校验值。调试助手一般能自动附加 CRC;自己写程序时用代码现算,粘错一个 CRC 总线上的设备就会直接丢弃这帧。

点击发送,模块立刻应答:

01 03 06 00 03 E6 70 00 02 D2 27

4. 解析应答:为什么是 6 个数据字节

紧跟功能码的那个 06 是数据字节数:

应答拆解

为什么是 6?1 个寄存器 = 16 位 = 2 字节,读了 3 个寄存器,就是 3 × 2 = 6 字节。这是检查应答是否合法的第一道关卡:字节数和寄存器数量对不上,说明通讯出了问题。


5. 高低 16 位拼接:255600 → 2556.00 kg

6 个数据字节分三组:

高低 16 位拼接
字节含义
00 03重量的高 16 位
E6 70重量的低 16 位
00 02精度:2 位小数

把高 16 位和低 16 位拼成一个 32 位数:

0x0003E670 = 255600(十进制)

注意 255600 还不是公斤,它只是变送器内部的整数值。精度寄存器告诉我们小数点在哪:精度 = 2,就把小数点向左移两位——

255600 ÷ 100 = 2556.00 kg

实际项目里变送器的小数位数是可设置的,所以规范做法永远是"重量值 × 精度"一起读,动态移小数点,而不是写死除以 100。


6. 有符号数与负数:补码

计算机底层只有 0 和 1,数据分有符号 / 无符号两种解读:

  • 无符号 16 位:0 ~ 65535
  • 有符号 16 位:-32768 ~ +32767,最高位是 1 就代表负数

那负重量在报文里长什么样?比如秤上挂了 -10 kg:

负数的补码
-10 的 32 位补码 = 0xFFFF FFF6

推导方法:10 的十六进制是 0x0000 000A,取反加一(补码规则)得到 0xFFFF FFF6。

好消息是:只要解析程序里把变量声明成有符号整型(C 的 int32_t、C# 的 int、PLC 的 D 寄存器按有符号读),它会自动完成补码换算,直接得到 -10,不需要手工转换。


7. 清零(去皮):写单个寄存器

秤台上放着包装箱,你想把这部分重量当"皮重"去掉,让读数归零。查表:地址 4,写 1 即清零。

用 06 功能码(写单个寄存器)构造报文:

清零报文
01 06 00 04 00 01 09 CB
│  │  │───│ │───│ └─ CRC
│  │  │   │ └─ 数据:写 1
│  │  └─ 寄存器地址 4(置零)
│  └─ 功能码 06:写单个寄存器
└─ 站号 1

发送后模块会原样回显这条指令——06 写指令的应答就是请求本身。看到回显就知道清零成功,再发一次读取指令,重量值已经归零。

注意:置零只在空载附近的小范围内有效(防误操作),大重量压秤时发置零指令会被拒绝。

8. 本课小结

整个流程五步:

  1. 接线:USB 转 RS485,A-A、B-B,串口参数 9600/8/N/1
  2. 查表:重量在地址 0-1(32 位),精度在地址 2,置零在地址 4
  3. 读:01 03 00 00 00 03 05 CB → 01 03 06 00 03 E6 70 00 02 D2 27
  4. 换算:高 16 位拼低 16 位 → 255600 → 按精度 2 移小数点 → 2556.00 kg
  5. 写:清零用 01 06 00 04 00 01 09 CB,回显即成功

常见问题速查:

现象原因
完全无应答A/B 接反、站号不对、串口参数不一致
应答乱码波特率/校验位不匹配
助手提示 CRC 错误报文抄错、或助手没开 CRC 附加
读出的数字巨大无比字序没处理,见第五课"高低字大坑"

下一篇(第五课)就把电脑换成 PLC,让整套读取流程自动跑起来。

微信二维码

扫码添加微信