Loading

RS485总线

RS485总线到底是什么?一篇讲清差分传输、MAX485、Modbus 和多机通信

很多人第一次接触 RS485,会把它和 UART、RS232、Modbus 混在一起。实际上,这几个东西根本不是同一层。

RS485 本质上是物理层标准,它规定的是:

  • 用什么电气方式传数据
  • 总线怎么接
  • 一条线上能挂多少设备
  • 多远距离还能稳定通信

而 Modbus RTU 这种东西,通常只是跑在 RS485 上面的协议

这篇文章就把 RS485 里最重要的几件事讲透:

  1. 差分信号为什么抗干扰
  2. MAX485 这类收发器到底干什么
  3. 总线为什么必须菊花链,不能随便星型
  4. 波特率和距离为什么互相制约
  5. Modbus RTU 为什么总和 RS485 一起出现
  6. 一主多从到底是怎么通信的

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 电平。

比如:

  • TXD
  • RXD

这些脚并不能直接拿去跑标准 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 通信,通常会这么写:

  1. 发包前切换到发送模式
  2. 串口发送数据
  3. 等待发送完成标志位
  4. 切回接收模式

伪代码示意:

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Ω 终端电阻

作用就是:做阻抗匹配,抑制反射。

典型规则:

  • 只放在总线两端
  • 不是每个节点都放
  • 中间节点一般不放终端

如果终端电阻乱放,会带来两个问题:

  1. 没有匹配,反射严重
  2. 负载过重,驱动能力下降

经验判断

如果你现场遇到:

  • 近距离正常,远距离不稳定
  • 低速正常,高速不稳定
  • 某几个节点经常掉线

就应该先检查:

  • 终端电阻有没有放对
  • 放了几个
  • 电阻值是不是合理

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 那样自带硬件仲裁机制。

所以最常见的工作方式是:

主从轮询

  1. 主机发命令
  2. 指定某个从机地址
  3. 只有被点名的从机回包
  4. 其他从机保持静默

示意流程:

主机 -> 地址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 计算错误
  • 地址配置冲突

现场表现

这些坑通常会表现成:

  • 近距离正常,远距离不稳定
  • 低速正常,高速不稳定
  • 单机正常,多机异常
  • 偶发掉线、偶发乱码、偶发超时

一旦遇到问题,建议按这个顺序查:

  1. 先查接线:A/B、GND、终端、偏置
  2. 再查波特率和参数一致性
  3. 再查 DE/RE 切换时序
  4. 最后查协议与 CRC

这个顺序往往比一上来盯代码更高效。


总结

RS485 之所以被广泛使用,不是因为它“高级”,而是因为它在工程上非常实用:

  • 差分传输,抗干扰强
  • 距离长,适合现场布线
  • 支持多节点,适合集中控制
  • 成本低,实现简单

但它也有前提:

  • 线要接对
  • 拓扑要规范
  • 终端和偏置要处理好
  • 半双工方向切换要写对

一句话记住:

RS485 解决的是“怎么把数据稳定送出去”,Modbus RTU 解决的是“送出去的数据长什么样”。

posted @ 2026-06-02 11:00  cc_record  阅读(83)  评论(0)    收藏  举报