一、前言
RS485只是硬件链路,Modbus-RTU才是总线通信语言,组网必须遵循统一协议规则。
市面代码痛点:CRC冗余复杂、协议耦合485底层、主从代码混用、超时无处理、多从机地址冲突、照搬网上臃肿协议栈。
本文亮点:底层485解耦、自研精简CRC16、分离主机/从机业务、标准时序帧判定、适配一主多从、可搭配ADC/定时器联动采集寄存器数据。
二、Modbus-RTU核心底层原理(工控必懂)
2.1 协议特点
- 物理层:基于RS485差分总线,一主多从拓扑,单总线最多挂载32台从设备。
- 传输模式:二进制报文,效率高于Modbus-ASCII。
- 校验方式:末尾CRC16多项式校验,防止总线干扰篡改数据。
- 帧判定:总线静默3.5个字节时间,判定一帧收发完成(核心时序规则)。
2.2 标准RTU帧格式(固定结构)
从站问询帧:【从机地址】+【功能码】+【起始高地址】+【起始低地址】+【寄存器个数高】+【寄存器个数低】+【CRC低字节】+【CRC高字节】
- 从机地址:01~247,总线唯一,组网区分设备。
- 功能码:03读保持寄存器、06写单个寄存器(项目最常用)。
- 寄存器地址:设备数据存储地址。
- CRC16:整帧校验,错误直接丢弃报文,不应答。
2.3 两大核心功能码(99%工控项目只用这两个)
- 03功能码:主机读取从机保持寄存器(读电压、温度、设备状态)。
- 06功能码:主机写入从机寄存器(控继电器、调速、参数设置)。
2.4 CRC16校验原理(自研代码依据)
工业标准多项式:0xA001
运算规则:初始值0xFFFF,报文逐字节异或移位,最终输出2字节校验码,低字节在前、高字节在后,不可颠倒。
三、实战组网项目方案
3.1 组网架构:一主两从
- 主机:STM32主控,轮询下发指令,采集所有从机数据。
- 从机1:地址0x01,挂载ADC电压采集寄存器。
- 从机2:地址0x02,挂载LED/继电器控制寄存器。
3.2 硬件依托
复用RS485驱动:USART2+PA4收发控制,自动切换收发模式,无需改动底层485代码。
3.3 协议设计规则
- 波特率9600,8N1,总线共地,末端120Ω终端电阻。
- 非法地址、CRC错误、帧长度错误,直接丢弃报文,无应答。
- 主机轮询间隔50ms,防止总线抢占冲突。
四、模块化全套代码(标准库、解耦分层、原创精简)
文件分层:modbus.h + modbus.c,完全解耦485底层,适配任意串口485驱动,自研CRC、主机发送、从机解

1914

被折叠的 条评论
为什么被折叠?



