串行通信入门:RS232与RS485,到底有什么不一样?
你有没有遇到过这样的场景:
调试一个温湿度传感器时,接上串口线,电脑却收不到数据;
或者在工控柜里看到一堆设备用一根“双绞线”串在一起,标着“485总线”,但不知道它为什么能连十几个设备?
这些背后,其实都离不开两种古老却依然强大的通信方式——RS232 和 RS485。
它们不是协议,也不是软件,而是硬件层面的“语言规则”。理解它们,就像学会听懂设备之间的“悄悄话”。
今天我们就抛开晦涩术语,用工程师的视角,把这两个“老前辈”讲清楚:它们怎么工作?谁更适合什么场合?为什么现在还在用?
从一根线说起:RS232 是怎么传数据的?
想象你要通过电线发一个字节0x55给另一台设备。这根线怎么知道是“1”还是“0”?
RS232 的答案是:看电压对地的高低。
它采用的是单端信号传输——所有信号都以公共地(GND)为参考点:
- 逻辑“0”:+3V 到 +15V
- 逻辑“1”:-3V 到 -15V
注意!这里的正负是反的——高电平代表0,低电平代表1。这种设计最早是为了兼容电话线路中的模拟信号,意外带来了不错的抗干扰能力。
最简单的连接:三根线搞定
RS232 只需要三根线就能通信:
-TXD:我发,你收
-RXD:你发,我收
-GND:共用地线,形成回路
这就构成了全双工通信——两边可以同时说话,像打电话一样。
但问题也来了:只能两个设备互连。你想加第三个?不行。这就是典型的点对点(Point-to-Point)结构。
实际使用中的坑
别以为插上线就能通。现代单片机比如 STM32 或 Arduino 使用的是 TTL 电平(0V/3.3V 或 5V),而 PC 上的串口是 RS232 电平(±12V)。直接连会烧芯片!
所以必须加个“翻译官”——电平转换芯片,比如MAX232、SP3232。它的作用就是把 MCU 的 0/5V 转成 ±10V,反过来也能接收。
⚠️ 小贴士:现在很多开发板已经内置了 USB-to-TTL 芯片(如 CH340、CP2102),可以直接和电脑通信,但我们仍习惯称其为“串口调试”,本质上已不是传统 RS232。
RS232 适合干啥?
- 板级调试输出日志
- 连接打印机、旧式扫码枪等外设
- 短距离通信(≤15米)
但它扛不住长距离压降和电磁干扰。工厂车间里电机一启动,串口数据就乱码?多半是用了 RS232 做远传。
那怎么办?换 RS485。
多设备联网的秘密武器:RS485 差分通信原理
如果把 RS232 比作两个人打电话,那RS485 就像是一个对讲系统,一个人喊话,一群人听着,只有被点名的那个才回应。
它是怎么做到的?
关键在于——差分信号。
差分是怎么抗干扰的?
RS485 用两根线 A 和 B 来传输信号,不看各自对地电压,而是看它们之间的电压差:
- 当 A 比 B 高 >200mV → 逻辑“0”
- 当 B 比 A 高 >200mV → 逻辑“1”
假设外界有个强电磁干扰,在两条线上都感应出 +1V 的噪声。但由于 A 和 B 几乎同步受影响,它们的差值仍然不变,接收端照样能正确判断原始信号。
这就是所谓的“共模抑制”能力。再配上屏蔽双绞线(STP),抗扰性能大幅提升。
半双工 vs 全双工
RS485 支持两种模式:
-半双工:一对线(A/B),既能发也能收,但不能同时进行。需要控制方向。
-全双工:两对线,一对专门发,一对专门收,可同时通信。
绝大多数应用采用半双工,因为节省布线成本。这也是 Modbus RTU 常用的方式。
总线结构:一条线挂几十个设备
RS485 最大的优势是支持多点通信。理论上可以在一条总线上挂32 个标准负载设备,用增强型收发器甚至能扩展到 256 个。
每个设备都有地址。主机发送命令时带上目标地址,所有从机都在监听,只有地址匹配的才会响应。
这就实现了真正的“主从轮询”架构,非常适合工业现场大量传感器集中管理。
硬件怎么接?软件怎么写?
我们来看一个典型的 RS485 应用场景:STM32 控制 MAX485 芯片,与其他设备通信。
硬件连接要点
| STM32 | MAX485 |
|---|---|
| UART_TX | DI(数据输入) |
| GPIO_X | DE / RE(使能控制) |
| GND | GND |
| A/B 引脚接总线 |
其中最关键的是DE/RE 引脚,用来控制 MAX485 是处于“发送模式”还是“接收模式”。
- DE=1, RE=0 → 发送使能
- DE=0, RE=1 → 接收使能
(有些芯片将两者集成在一个引脚)
如果不控制方向,设备永远处于接收态,无法发出数据;或者一直占用总线,导致其他设备无法通信。
软件实现:方向切换不能少
#include "stm32f4xx_hal.h" UART_HandleTypeDef huart2; #define RS485_DIR_PIN GPIOD, GPIO_PIN_5 // 初始化方向控制IO void RS485_Init(void) { __GPIOD_CLK_ENABLE(); GPIO_InitTypeDef gpio = {0}; gpio.Pin = GPIO_PIN_5; gpio.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出 gpio.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOD, &gpio); HAL_GPIO_WritePin(RS485_DIR_PIN, GPIO_PIN_RESET); // 默认接收 } // 带方向控制的数据发送 HAL_StatusTypeDef RS485_Send(uint8_t *data, uint16_t len, uint32_t timeout) { // 切换到发送模式 HAL_GPIO_WritePin(RS485_DIR_PIN, GPIO_PIN_SET); // 发送数据 HAL_StatusTypeDef status = HAL_UART_Transmit(&huart2, data, len, timeout); // 发送完成后切回接收 while (!(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_TC))); // 等待发送完成 HAL_GPIO_WritePin(RS485_DIR_PIN, GPIO_PIN_RESET); return status; }📌 关键细节:
- 必须等 UART 发送完成后再切换回接收模式,否则最后几个字节可能丢失。
- 使用UART_FLAG_TC标志位确保数据完全移出移位寄存器。
这个函数就是构建 Modbus 主站的基础。你可以封装成Modbus_SendPacket(...),配合 CRC 校验和超时重试机制,形成稳定通信。
RS232 和 RS485 到底该怎么选?
别纠结,记住这张表就够了:
| 对比项 | RS232 | RS485 |
|---|---|---|
| 设备数量 | 仅2个 | 最多256个 |
| 通信距离 | ≤15米 | 可达1200米 |
| 抗干扰性 | 弱,依赖良好接地 | 强,差分+屏蔽线双重保障 |
| 数据模式 | 全双工 | 多为半双工 |
| 成本 | 低(短线无需额外电路) | 中等(需终端电阻、保护器件) |
| 典型用途 | 调试口、本地外设 | 工业PLC、远程仪表、楼宇自控 |
实际案例对比
场景1:给新做的电路板加个调试口
✅ 选择 RS232(或更准确地说,TTL串口转USB)
理由:只连一台PC,距离短,成本低,开发方便。
场景2:把10个分布在厂区的电表数据采集回来
✅ 选择 RS485
理由:远距离、多节点、环境复杂,必须用差分总线。
场景3:电梯控制系统中楼层信号上传
✅ RS485 + Modbus RTU
理由:多个轿厢和控制器共享同一总线,实时性和可靠性要求高。
工程实践中的那些“坑”与解决办法
1. 信号反射导致通信失败?
长距离传输时,信号会在电缆末端反射,造成波形畸变。
🔧 解法:在总线两端各加一个120Ω终端电阻,匹配特性阻抗,吸收能量。
✔ 正确做法:只在最远的两个节点加上拉/下拉后的120Ω电阻,中间节点不要接。
2. 总线空闲时误触发?
当没有设备发送时,A/B线处于悬空状态,容易受干扰进入不确定电平。
🔧 解法:添加偏置电阻
- A线接上拉电阻(560Ω ~ 1kΩ)到 VCC
- B线接下拉电阻到 GND
这样空闲时 A>B,形成稳定的逻辑“1”(Marking state),符合 Modbus 起始条件。
3. 地线环路引入噪声?
多个设备远距离连接,地电位不同,产生地环流,破坏差分平衡。
🔧 解法:使用隔离型 RS485 收发器,如 ADM2483、SN65HVD12
内部集成 DC-DC 隔离电源和数字隔离器,彻底切断地环路,提升系统稳定性。
波特率怎么选?距离与速度的权衡
RS485 不是越高越好。越高速度,对布线和终端匹配的要求越高。
一般经验法则:
| 传输距离 | 推荐最大波特率 |
|---|---|
| < 10 米 | 10 Mbps |
| 50 米 | 2.5 Mbps |
| 100 米 | 1 Mbps |
| 500 米 | 115.2 kbps |
| 1200 米 | 9.6 kbps ~ 38.4 kbps |
原则很简单:距离越长,速率越低。
如果你要在 800 米外稳定通信,别想着跑 115200,老老实实用 19200 或更低。
结语:为什么学这些“老技术”还重要?
也许你会问:现在都物联网时代了,WiFi、LoRa、MQTT 都出来了,还学 RS485 干嘛?
答案是:底层没变,根基仍在。
- 90% 的工业传感器仍提供 RS485 接口
- Modbus over RS485 是全球最普及的工业通信组合
- 很多网关设备的第一步,就是先把 485 数据转成 TCP/IP 上云
不懂物理层,你怎么排查“为什么读不到数据”?
是地址错了?波特率不对?接线反了?终端电阻漏了?还是根本没有供电?
这些问题,不会出现在 Wireshark 里,只能靠你手里的万用表和示波器,一层层剥开。
🔧动手建议:
买一块 STM32 开发板 + 几个 MAX485 模块 + 若干跳线,搭建一个小系统:
- 一个作为主机轮询
- 两个作为从机模拟温湿度上报
- 用 Modbus 协议通信
当你亲眼看到“01 03 00 00 00 02 C4 0B”这样的报文成功交换,并解析出有效数据时,你就真正跨过了嵌入式通信的第一道门槛。
而这扇门的背后,还有 CAN、I2C、SPI、Ethernet、RTOS……等待你一步步深入探索。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考