RS485总线
RS485总线到底是什么?一篇讲清差分传输、MAX485、Modbus 和多机通信
很多人第一次接触 RS485,会把它和 UART、RS232、Modbus 混在一起。实际上,这几个东西根本不是同一层。
RS485 本质上是物理层标准,它规定的是:
- 用什么电气方式传数据
- 总线怎么接
- 一条线上能挂多少设备
- 多远距离还能稳定通信
而 Modbus RTU 这种东西,通常只是跑在 RS485 上面的协议。
这篇文章就把 RS485 里最重要的几件事讲透:
- 差分信号为什么抗干扰
- MAX485 这类收发器到底干什么
- 总线为什么必须菊花链,不能随便星型
- 波特率和距离为什么互相制约
- Modbus RTU 为什么总和 RS485 一起出现
- 一主多从到底是怎么通信的
1. RS485 是什么
RS485 是一种差分串行通信物理层标准。
它最常见的使用方式是:
- 两根信号线:A、B
- 半双工通信
- 多节点挂载
- 长距离传输
- 抗干扰能力比普通 TTL 串口强很多
在工程里,RS485 常见在这些场景:
| 场景 | 典型设备 |
|---|---|
| 工业仪表 | 电表、水表、温控器、压力传感器 |
| 智能照明 | 灯带控制器、调光器、集中控制面板 |
| 楼宇自控 | 空调末端、门禁、采集器 |
| 工厂设备 | PLC、触摸屏、变频器、从站模块 |
| 现场调试 | 上位机 + 485 转 USB 调试设备 |
对于你这种做嵌入式 控制的人来说,RS485 非常常见,因为它特别适合:
- 设备分散安装
- 现场线缆较长
- 电磁环境比较差
- 需要一主多从统一管理
2. 差分传输为什么抗干扰
RS485 最核心的特点,就是它不是看单根线的电平,而是看 A-B 的电压差。
可以简单理解成:
接收器不是单独看 A,也不是单独看 B
而是看:VA - VB
典型判断方式可以概括成:
- A > B:表示一种逻辑状态
- B > A:表示另一种逻辑状态
重点在这里:
如果外界噪声同时叠加到 A 和 B 上,那么这类噪声往往属于共模干扰。由于接收器最后做的是减法:
$$
V_{diff}=V_A - V_B
$$
那么两根线同时被抬高或压低时,差值变化并不会太大,于是干扰就被抵消掉一大部分。
这就是为什么 RS485 比普通 TTL UART 更适合:
- 长线
- 工业现场
- 电机附近
- 开关电源附近
- 照明系统这种干扰不小的环境
一个直观对比
| 通信方式 | 判决依据 | 抗干扰能力 |
|---|---|---|
| 普通 UART(TTL) | 单根线对地电平 | 一般 |
| RS232 | 单端电平 | 一般 |
| RS485 | A/B 差分电压 | 强 |
所以很多人会说:
RS485 能跑得远,不只是因为“线材好”,而是因为它的判决方式本身就更抗干扰。
3. MCU 为什么不能直接接 RS485,总要加 MAX485?
很多 MCU 自带的是 UART 外设,但 UART 只是逻辑层接口,通常输出的是 TTL/CMOS 电平。
比如:
TXDRXD
这些脚并不能直接拿去跑标准 RS485 总线。
所以中间必须加一个收发器芯片,最经典的就是:
- MAX485
- SN75176
- SP3485
- ADM485 等
MAX485 常见引脚含义
| 引脚 | 作用 |
|---|---|
| DI | Driver Input,发送输入(接 MCU TXD) |
| RO | Receiver Output,接收输出(接 MCU RXD) |
| DE | Driver Enable,发送使能 |
| /RE | Receiver Enable,接收使能 |
| A/B | 差分总线 |
连接关系通常是:
MCU TXD -> DI
MCU RXD <- RO
MCU GPIO -> DE / RE
A/B -> RS485 总线
为什么 DE/RE 很重要
RS485 最常见的是半双工,也就是说:
- 发的时候走这对线
- 收的时候也走这对线
- 不能一边发一边收同一对线
所以必须控制方向。
常见控制逻辑:
| 状态 | DE | RE |
|---|---|---|
| 发送态 | 1 | 0 |
| 接收态 | 0 | 1 |
这也是很多 RS485 程序里最容易出问题的地方:
- 发之前忘了拉高 DE
- 发完之后忘了切回接收
- 切换太快,最后几个字节还没真正发出去
工程实现要点
如果你在 STM32、GD32、ESP32 上做 485 通信,通常会这么写:
- 发包前切换到发送模式
- 串口发送数据
- 等待发送完成标志位
- 切回接收模式
伪代码示意:
void rs485_send(uint8_t *buf, uint16_t len)
{
RS485_DE_HIGH(); // 进入发送态
HAL_UART_Transmit(&huart1, buf, len, 100);
while (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TC) == RESET) {
}
RS485_DE_LOW(); // 切回接收态
}
这里最关键的是:
不要只等发送寄存器空,要等整个帧真正发完。
否则你太早切回接收,就容易把尾巴截掉。
4. RS485 总线为什么必须菊花链
很多通信不稳定,根本不是协议问题,而是接线方式错了。
RS485 推荐的拓扑是:
- 一条主干线
- 各个节点依次挂上去
- 也就是常说的菊花链 / 手拉手
示意:
主机 ---- 从机1 ---- 从机2 ---- 从机3
而不是:
从机1
|
主机 ---- 汇聚点 ---- 从机2
|
从机3
这种星型接法在低速、短线时有时候“看起来能用”,但一旦:
- 距离长
- 波特率高
- 节点多
- 干扰强
就很容易出问题。
原因:反射
RS485 是高速边沿信号在传输线上传播。
如果阻抗不连续、分支太多,就会有反射。反射严重时会出现:
- 波形畸变
- 误码
- 偶发掉线
- 某些设备时好时坏
所以现场布线时,原则非常明确:
优先走一条主干,节点短支路接入,不要搞长分叉星型。
5. 为什么两端要加 120Ω 终端电阻
RS485 总线两端通常会各放一个 120Ω 终端电阻。
作用就是:做阻抗匹配,抑制反射。
典型规则:
- 只放在总线两端
- 不是每个节点都放
- 中间节点一般不放终端
如果终端电阻乱放,会带来两个问题:
- 没有匹配,反射严重
- 负载过重,驱动能力下降
经验判断
如果你现场遇到:
- 近距离正常,远距离不稳定
- 低速正常,高速不稳定
- 某几个节点经常掉线
就应该先检查:
- 终端电阻有没有放对
- 放了几个
- 电阻值是不是合理
6. 偏置电阻是干什么的
除了终端电阻,很多 RS485 网络还会加偏置电阻。
偏置的作用是:
在总线空闲、没人发送的时候,给 A/B 一个明确的默认状态。
否则总线悬空时,接收器可能会因为噪声抖动而误判。
常见做法是:
- A 上拉
- B 下拉
这样空闲时总线就不会漂。
偏置做得不好时,常见现象是:
- 空闲时误触发
- 帧头乱跳
- 程序收到莫名其妙的垃圾字节
在工业控制和智能照明系统里,这种问题特别烦,因为它往往不是一直错,而是偶尔错,排查起来最耗时间。
7. 节点数、距离、波特率三者的关系
RS485 经常被一句话概括:
能跑远、能挂多。
但这个结论要加前提。
1)节点数
标准 RS485 收发器,常见说法是:
- 最多 32 个标准节点
现在很多增强型芯片能做到:
- 64 节点
- 128 节点
- 甚至更多
但这依赖具体芯片输入阻抗,不是所有 485 芯片都一样。
2)距离和波特率此消彼长
经验上经常这么说:
| 波特率 | 典型距离 |
|---|---|
| 9600bps | 约 1200m |
| 19200bps | 更短 |
| 115200bps | 通常几百米以内 |
这不是绝对值,因为还跟这些有关:
- 线材质量
- 是否双绞线
- 布线方式
- 终端匹配
- 节点数量
- 干扰环境
但规律是确定的:
距离越远,波特率就越要保守。
3)DE 切换时间也要算进去
半双工里,除了线路本身,程序切换时序也很关键。
特别是在主从轮询时,如果:
- 主机发完还没完全释放总线
- 从机就开始应答
那就会发生冲突。
所以工程上要给 DE 收发切换留余量,必要时在协议层加间隔。
8. Modbus RTU 为什么总和 RS485 一起出现
很多人说“我做的是 Modbus 通信”,其实背后常常是:
- 物理层:RS485
- 协议层:Modbus RTU
这两者不是一回事。
一个典型 Modbus RTU 帧
| 地址 | 功能码 | 数据 | CRC |
常见功能码:
| 功能码 | 含义 |
|---|---|
| 03 | 读保持寄存器 |
| 06 | 写单个寄存器 |
| 16 | 写多个寄存器 |
此外,Modbus RTU 还要求:
- 帧和帧之间有静默间隔
- CRC 校验必须正确
- 一般采用主从问答模式
所以如果你在灯带控制器、驱动电源、仪表模块里看到“485 通信”,十有八九上层跑的就是 Modbus RTU 或者其变种私有协议。
9. 一主多从是怎么通信的
RS485 很适合做多机组网,但它本身不负责仲裁。
也就是说,它不像 CAN 那样自带硬件仲裁机制。
所以最常见的工作方式是:
主从轮询
- 主机发命令
- 指定某个从机地址
- 只有被点名的从机回包
- 其他从机保持静默
示意流程:
主机 -> 地址02,读寄存器
从机02 -> 返回数据
从机01/03 -> 不响应
这个机制非常适合:
- 集中控制多个调光节点
- 读取多个传感器
- 楼宇照明分区控制
- 工厂现场采集多个从站数据
为什么“同一时刻只能一个发送者”
因为总线是共享的。
如果两个设备同时发:
- 波形会叠在一起
- 数据就会冲突
- 最终谁也收不对
所以 RS485 系统设计里最重要的一个原则就是:
协议必须保证同一时刻只有一个节点驱动总线。
这也是为什么主从结构这么常见——简单、稳定、好实现。
10. RS485、RS232、CAN 怎么选
很多项目里都会面临这个问题:到底该用哪种总线?
可以先看一个直观对比:
| 项目 | RS485 | RS232 | CAN |
|---|---|---|---|
| 信号方式 | 差分 | 单端 | 差分 |
| 距离 | 远(典型 1200m) | 短(典型 15m) | 远 |
| 节点数量 | 多节点 | 点对点 | 多节点 |
| 双工方式 | 半双工常见 | 可全双工 | 多主仲裁 |
| 仲裁能力 | 无 | 无 | 有硬件仲裁 |
| 成本 | 低 | 低 | 中等 |
什么时候选 RS485
如果你的需求是:
- 低成本
- 线比较长
- 设备分散
- 一主多从
- 速率要求不是极高
那 RS485 很合适。
什么时候别选 RS485
如果你需要:
- 多主同时发
- 强实时性
- 自动仲裁
- 更规范的总线冲突管理
那 CAN 往往更合适。
RS232 还适合什么
RS232 现在更多是:
- 老设备维护
- 点对点调试
- 某些传统仪器接口
新设计里,如果是多节点和长距离,基本都会优先看 RS485。
11. 在嵌入式产品里,RS485 常见怎么用
结合你这个方向,RS485 在照明和嵌入式产品里特别常见的用途有:
智能照明控制
- 主控器统一下发亮度、色温、场景参数
- 多个灯具驱动器挂在一条 485 总线上
- 通过地址区分各个节点
电源参数配置
- 修改恒流值
- 读取输出电压、电流、温度
- 查询故障码
产线测试与校准
- 工装通过 485 批量读取参数
- 写入校准值
- 老化测试时收集设备状态
现场维护
- 上位机通过 USB 转 485 连接现场设备
- 调试地址、波特率、工作模式
- 做故障诊断和参数备份
这也是为什么做 LED 电源、调光控制、灯带控制的人,几乎绕不开 RS485。
12. 做 RS485 最容易踩的坑
最后给一个工程里最有用的排查清单。
硬件侧
- A/B 接反
- 没有共地或参考地处理不当
- 终端电阻位置错误
- 偏置缺失导致空闲漂移
- 星型接线导致反射
- 线材不合适,没有用双绞线
软件侧
- DE 发送使能切换时机错误
- 发完没有等真正发送完成
- 从机回复过快,总线释放不干净
- 帧间隔处理不对
- CRC 计算错误
- 地址配置冲突
现场表现
这些坑通常会表现成:
- 近距离正常,远距离不稳定
- 低速正常,高速不稳定
- 单机正常,多机异常
- 偶发掉线、偶发乱码、偶发超时
一旦遇到问题,建议按这个顺序查:
- 先查接线:A/B、GND、终端、偏置
- 再查波特率和参数一致性
- 再查 DE/RE 切换时序
- 最后查协议与 CRC
这个顺序往往比一上来盯代码更高效。
总结
RS485 之所以被广泛使用,不是因为它“高级”,而是因为它在工程上非常实用:
- 差分传输,抗干扰强
- 距离长,适合现场布线
- 支持多节点,适合集中控制
- 成本低,实现简单
但它也有前提:
- 线要接对
- 拓扑要规范
- 终端和偏置要处理好
- 半双工方向切换要写对
一句话记住:
RS485 解决的是“怎么把数据稳定送出去”,Modbus RTU 解决的是“送出去的数据长什么样”。

浙公网安备 33010602011771号