硬件接口与电气特性:RS-232、RS-485、TTL 电平标准对比
做 UART 通信,光会写代码可不够。我见过太多工程师,软件调得飞起,一接上硬件就抓瞎——要么通信距离不够,要么烧芯片。说白了,你得先搞懂这些接口到底在物理层干了什么。
今天咱们就把 RS-232、RS-485 和 TTL 这三个老伙计拉出来遛遛。它们本质上都是在传 UART 的数据帧,但电气特性天差地别。选错了,项目就得返工。
TTL 电平:板级通信的默认选项
TTL 电平是单片机最常用的。逻辑 1 对应 3.3V 或 5V,逻辑 0 对应 0V。简单粗暴,但抗干扰能力弱,传输距离一般不超过 1 米。
我记得刚入行时做过一个项目,板子上的两块 MCU 用 TTL 直连,跑 115200bps 稳得很。后来客户要求把其中一块 MCU 放到 3 米外,结果数据全是乱码。嗯,这就是 TTL 的局限性——它只适合板内或短距离通信。
RS-232:老当益壮的工业标准
RS-232 用正负电压表示逻辑电平:-3V ~ -15V 为逻辑 1,+3V ~ +15V 为逻辑 0。这种差分思想(虽然它不算真正的差分)让它的抗干扰能力比 TTL 强不少,传输距离能到 15 米左右。
但 RS-232 有个硬伤——它只能点对点通信。你想想看,一个串口只能连一个设备,这在现代工业现场多憋屈。不过很多老设备(比如 PLC、工业仪表)还在用这个接口,所以你还得会伺候它。
RS-485:工业现场的王牌
RS-485 才是真正的差分信号。它用两根线(A、B)的电压差来传数据:A-B > +200mV 为逻辑 1,A-B < -200mV 为逻辑 0。这种设计让它能抗共模干扰,传输距离轻松到 1200 米。
更厉害的是,RS-485 支持多节点通信。一条总线上最多能挂 256 个设备(实际受驱动芯片限制)。我在一个工厂项目中用过 32 个温湿度传感器挂一条 RS-485 总线,跑 9600bps,一年没出过问题。
三种接口的电气参数对比
| 参数 | TTL (3.3V) | RS-232 | RS-485 |
|---|---|---|---|
| 逻辑 1 电平 | 2.0V ~ 3.6V | -3V ~ -15V | A-B > +200mV |
| 逻辑 0 电平 | 0V ~ 0.8V | +3V ~ +15V | A-B < -200mV |
| 传输方式 | 单端 | 单端 | 差分 |
| 最大距离 | 1 米 | 15 米 | 1200 米 |
| 节点数 | 点对点 | 点对点 | 最多 256 |
| 抗干扰能力 | 弱 | 中 | 强 |
常见接口芯片:MAX232 与 SP3485
光有协议标准还不够,你得用芯片把电平转过来。这里介绍两个我常用的芯片。
MAX232:TTL 转 RS-232 的老将
MAX232 内部有电荷泵,能把 5V 电源升到 ±10V 左右,满足 RS-232 的电平要求。它内置两路收发器,一路发一路收,正好对应 UART 的 TX 和 RX。
我踩过一个坑:MAX232 的 VCC 必须接 5V,不能接 3.3V。有一次我手头只有 3.3V 电源,想着凑合用,结果输出电平只有 ±5V,接上 RS-232 设备后通信时断时续。后来查手册才发现,3.3V 版本叫 MAX3232,别搞混了。
SP3485:RS-485 的可靠选择
SP3485 是 3.3V 供电的 RS-485 收发器,最高速率能到 10Mbps。它内部有失效保护功能——当总线开路或短路时,输出为逻辑 1,避免误触发。
SP3485 的引脚很简单:RO 接 MCU 的 RX,DI 接 TX,RE 和 DE 分别是接收使能和发送使能。我习惯把 RE 和 DE 连在一起,用一个 GPIO 控制方向。发送时拉高,接收时拉低,省一个引脚。
// SP3485 方向控制示例
#define RS485_DE_RE PB1 // 方向控制引脚
void rs485_send_byte(uint8_t data) {
// 切换到发送模式
GPIO_SetBits(GPIOB, RS485_DE_RE);
// 等待方向切换稳定(约 1μs)
delay_us(1);
// 发送数据
USART_SendData(USART1, data);
// 等待发送完成
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
// 切回接收模式
GPIO_ResetBits(GPIOB, RS485_DE_RE);
}
接口选型决策流程
选接口其实没那么复杂。我一般按这个思路来:
- 先看距离: 1 米以内用 TTL,15 米以内用 RS-232,超过 15 米用 RS-485。
- 再看节点数: 超过两个设备必须用 RS-485。
- 最后看干扰: 电机、变频器附近优先 RS-485。
下面这张图把整个决策过程画出来了,你照着走就行。
实际项目中的接口转换
很多时候,你手头的 MCU 是 TTL 电平,但外设是 RS-232 或 RS-485。这时候就需要电平转换电路。我一般这么搭:
- TTL → RS-232: MAX232 或 MAX3232,注意供电电压和电容值。
- TTL → RS-485: SP3485 或 MAX3485,注意方向控制和终端电阻(120Ω)。
- RS-232 → RS-485: 需要两级转换,先用 MAX232 转成 TTL,再用 SP3485 转成 RS-485。