上一课搞懂了串口和协议的概念。这一课讲工业界最常用的串口协议——Modbus RTU:主从机制、帧结构、功能码、CRC 校验,全部讲透。学会它,全世界的 PLC、变频器、电表你都能对话。
Modbus 是一种主从式(Master/Slave)通讯协议,RTU 是它跑在串口(RS485)上的形态。
所谓一主多从:

主站发起请求,从站负责应答,从站永远不会主动说话
一条总线上只有一个主站,最多可以挂 247 个从站
每个从站有唯一的地址,范围 1 ~ 247,地址 0 留作广播
主站像点名老师:问 1 号,1 号答;问 2 号,2 号答。没人问的时候,从站就安安静静待着。
一帧 RTU 报文由四部分组成:

| 部分 | 长度 | 作用 |
|---|---|---|
| 地址 | 1 字节 | 发给哪个从站(1 ~ 247) |
| 功能码 | 1 字节 | 要干什么(读 / 写) |
| 数据 | 长度可变 | 寄存器地址、数量、写入值等 |
| CRC16 | 2 字节 | 校验码,判断传输有没有出错 |
还有个容易忽略的细节:帧与帧之间至少要有 3.5 个字符时间的静默,接收方靠这段"安静"来判断一帧从哪开始、到哪结束。所以串口助手连续发送时粘包,很多时候就是静默时间不够。
功能码就是"动词",告诉从站要执行什么动作:

| 功能码 | 动作 | 说明 |
|---|---|---|
03 | 读保持寄存器 | 最常用,读传感器数据 |
06 | 写单个寄存器 | 改参数、下命令 |
10(16) | 写多个寄存器 | 批量下发 |
04 | 读输入寄存器 | 读只读数据 |
01 / 02 | 读线圈 / 输入离散量 | 读开关量 |
记住 03 和 06 就能应付大部分现场:一个读、一个写。
请求:主站要读从站 1、从地址 0 开始的 2 个寄存器:

01 03 00 00 00 02 C4 0B 地址 功能码 起始地址 寄存器数 CRC16
应答:从站正常响应:

01 03 04 00 0A 00 14 B4 06 地址 功能码 字节数 数据(2 个寄存器) CRC16
逐段解读:
01:从站 1 在回答
03:功能码原样返回,表示"我执行的是读"
04:后面有 4 个数据字节(2 个寄存器 × 2 字节)
00 0A = 10,00 14 = 20:两个寄存器的值
B4 06:从站对这帧算出的 CRC
注意请求和应答的字节数变化:请求里数据是"起始地址 + 数量"(4 字节),应答里多了一个字节数字段,因为主站需要知道后面跟了几个字节。
如果地址不存在、功能码不支持,从站不会沉默,而是返回异常响应:
01 83 02 ... 地址 功能码+80 异常码
两个特征:功能码最高位置 1(03 → 0x83),后面跟一个异常码(01 = 非法功能,02 = 非法地址,03 = 非法数据……)。看到 0x8x 开头的应答,别慌,去查异常码表就行。
多设备组网时的注意事项:

轮询机制:主站依次询问从站 1、2、3……同一时刻只允许一问一答(半双工的物理限制决定的)。

组网检查清单:
| 项目 | 要求 |
|---|---|
| 地址 | 每个从站唯一,不能重复 |
| 通讯参数 | 波特率、校验位、停止位全部一致 |
| 终端电阻 | 总线两端各加 120Ω,吸收反射信号 |
| 线材 | 屏蔽双绞线,减少干扰 |
| 超时重试 | 某从站掉线不能拖垮整个总线 |
| 轮询周期 | = 各从站响应时间 + 帧间隔的总和 |
Modbus RTU 的应用面极广:PLC、变频器、电表、温控表、称重变送器……几乎所有的工业仪表都支持。它也常通过网关转成 Modbus TCP 接入 SCADA 系统(第六课详讲)。
调试时的顺序:
先确认串口参数(波特率 / 校验 / 停止位)一致;
用串口调试助手发报文(下一课手把手做);
重点看 CRC 对不对、应答字节数对不对;
没有应答先查 A/B 线有没有接反。
主从 · 地址 · 功能码 · CRC
主从:主站问、从站答,一问一答
地址:1~247,总线上唯一
功能码:03 读、06 写
CRC:两个字节的校验,错了就丢弃
下一篇,我们把传感器接进来:称重传感器是怎么把重量变成电信号的。