RS485 与 Modbus:一根差分线怎么把信号送出一千米
你在桌上用 UART 连个模块,两根线一插就通。可到了工厂车间——电机嗡嗡转、变频器嗡嗡响、线还得拉几十上百米——UART 那点 3.3V 电平根本扛不住,噪声一灌进来数据全是乱码。工业现场怎么远距离、抗强干扰地通信?答案八成是 RS485。一句话先撂这儿:RS485 不是新协议,它是把 UART 的信号换了副"抗造"的身板——从单端电平改成差分传输。 抓住这句,后面全通。
RS485 是 UART 的"差分升级版"
先分清一件容易混的事:RS485 管的是"电怎么走线"(物理层),不管"数据长啥样"(协议)。 它只规定电压怎么表示 0/1、用几根线、传多远、挂多少设备;至于每字节几位、有没有校验,那还是 UART 那套帧格式说了算。所以:RS485 = UART 的帧 + 一套更结实的电气传输。
UART 是单端信号——一根 TX 线相对地摆动,高电平算 1、低电平算 0。桌面上没问题,可传远了、噪声大了就露怯:接收端拿"线对地"的电压去判 0/1,外界干扰直接叠上来就容易判错。RS485 换了思路:用 A、B 两根线电压相反地摆动,接收端不看某根线对地多少伏,只看 A 减 B 的差。 这就是差分信号。
差分:为什么它能顶着噪声传一千米
原理特别朴素。A、B 两根线绞在一起并排走,外界干扰打过来,几乎同时同量地灌进这两根线——A 抬高多少,B 也抬高差不多。可接收端算的是 A − B,两根线上共同抬起的那部分噪声一减就抵消没了。这叫共模抑制:干扰是"共模"(两线一起动),有用信号是"差模"(两线反着动),做减法只留差模、砍掉共模。
这就是 RS485 能在电机、变频器边上传上千米还不出错的底气:
| 单端(UART/TTL) | 差分(RS485) | |
|---|---|---|
| 判 0/1 的依据 | 一根线对地的电压 | A、B 两线的电压差 |
| 噪声怎么办 | 直接叠上去,判错 | 共模噪声相减抵消 |
| 传输距离 | 几米就顶天 | 可达 1200 米(低速) |
| 抗干扰 | 弱 | 强 |
一句话:单端是"看绝对值",容易被噪声抬歪;差分是"看两线之差",噪声一减就走。
半双工:一对线上,收发得排队
RS485 最常见的接法是半双工——只用 A、B 一对线,收发共用。好处是省线;代价是同一时刻只能一个方向说话,收发得排队。
这带来一个 UART 上没有的东西:方向控制。UART 的 TX、RX 是两根独立的线,从不用管方向;RS485 半双工只有一对线,收发器必须知道"现在该发还是该收"——靠一个方向控制脚来切:
- DE(Driver Enable,发送使能):拉高,收发器进入"发送"态,把 MCU 的 TX 驱动到 A/B 线上。
- RE(Receiver Enable,接收使能):拉低有效,收发器进入"接收"态,把 A/B 线上的差分还原成电平喂回 MCU 的 RX。
实际用时通常把 DE 和 RE 连到一起,用一个 GPIO 控制:发之前拉高(切发送)、发完立刻拉低(切回接收)。 这个切换时机是 RS485 编程最容易翻车的地方——切晚了漏收对方回复,切早了把自己没发完的尾巴截断、对方收到残帧。所以代码里务必等 UART 发送真正完成(FIFO 和移位寄存器都空)再切方向,不能发完最后一个字节的函数一返回就切。
挂多设备与终端电阻
RS485 天生是总线型:一对 A/B 线像一条主干,几十个设备(标准到 32 个,高阻收发器可更多)全并联挂上去,谁想说话谁把 DE 拉高发,其余都乖乖收。这也是它比 UART 强的一大点——UART 基本点对点两个设备,RS485 是一根线串一串。
拉长了就得管终端电阻。信号在长线两端会像声音撞墙一样反射回来,叠在原信号上把波形搞花。办法是在总线最远两端各并一个 120Ω 电阻(匹配双绞线特征阻抗),把跑到头的能量吸收掉。记住:只在物理最两端各加一个,中间设备不加;线一长、速率一高,不加就会偶发误码。
Modbus RTU:跑在 RS485 上的"主从问答"
光有 RS485 这条结实的线还不够——线上一堆设备,谁先说、地址怎么分,得有上层协议来管。工业现场最经典的搭配就是 Modbus RTU 跑在 RS485 上。
Modbus RTU 一句话讲清:它是"一主多从"的问答协议——主机发问、从机应答,从机绝不主动开口。 每个从机有唯一地址(1~247),主机报文点名"跟几号说话",只有那个从机回应。一帧典型报文是:从机地址 + 功能码 + 数据 + CRC 校验。这纪律正好配上 RS485 半双工"一次只能一个方向说话"——从机平时都挂接收态,被点名才短暂切发送回一句,天生不打架。
记住这层关系就够:RS485 是"路"(怎么把字节可靠送到),Modbus 是"交通规则"(谁什么时候能上路说什么)。 两者常一起出现但可拆——RS485 上能跑别的协议,Modbus 也能跑别的物理层(如 Modbus TCP 跑网线)。
ESP32-S3 怎么接:一颗 MAX485 就够
ESP32-S3 本身没有差分驱动能力,只有普通 UART 的单端 TX/RX。要接上 RS485 总线,中间加一颗收发器芯片当"翻译",最常见的就是 MAX485:把单端 TX 转成 A/B 差分推上总线、把总线差分转回单端喂给 RX。
接线就四根信号:
- MCU 的 TX → MAX485 的 DI(要发的数据进来)
- MCU 的 RX ← MAX485 的 RO(收到的数据出去)
- MCU 的一个 GPIO → DE 和 RE(两脚短接,一起控制收发方向)
- MAX485 的 A、B → 接总线,两端配 120Ω 终端电阻
好在 ESP-IDF 的 UART 驱动内置了 RS485 半双工模式(uart_set_mode 设成 UART_MODE_RS485_HALF_DUPLEX),能让硬件按发送状态自动翻转 RTS 脚当方向信号,省得你手动掐 DE/RE 切换时机——正好绕开上面那个坑。
RS485 现场调试的两大高频坑:① A/B 接反——现象是完全收不到或全乱码,把 A、B 对调一下试试,这是最常见的低级错;② 方向没切干净——发完没及时切回接收就漏收应答,务必等发送真正完成再切(用 IDF 的 RS485 硬件模式自动切最稳)。另外长线不加 120Ω 终端会偶发误码,别省这两个电阻。
一句话口诀
RS485 是 UART 的差分升级版:A、B 两线反相摆动、接收端只看差值,共模噪声一减就走,能顶着工业干扰传上千米。半双工一对线收发排队,靠 DE/RE 方向脚切(发完再切回收);总线两端各加 120Ω 终端。跑在它上面的 Modbus RTU 是"主机点名、从机应答"的一主多从协议。ESP32-S3 加一颗 MAX485 就能接进去,用 IDF 的 RS485 硬件模式自动切方向最省心。
下一步
RS485 是 UART 的差分化身,想把串口帧格式和波特率吃透就回那篇。另一根汽车、工业爱用的差分总线是 CAN,它也靠差分抗干扰,但多了 ID 优先级仲裁,和 RS485 对着看很有意思。到底该用哪种总线,去 五大总线怎么选 对号入座。回 元器件原理总览 补齐其余基础。