2、UART物理层:RS232、TTL、RS485等电平标准对比归纳总结

做UART通信这么多年,我踩过最大的坑,往往不是协议解析,而是物理层没选对。信号线忽高忽低,通信断断续续,最后发现是电平不匹配——说白了,电压都没对上,数据怎么可能对?

这一章,咱就把常见的三种物理层标准掰开揉碎了讲。你想想看,TTL、RS232、RS485,名字听着差不多,实际用起来天差地别。我会用实际项目的教训,帮你一次理清。

2.1 为什么物理层这么重要?

UART协议是异步的,只关心时序,不关心电压是多少。但物理层决定了:高电平是多少伏?低电平是多少伏?能传多远?抗干扰怎么样?

注意: 我曾经在一个项目中,直接用TTL电平去接RS232接口的设备,结果冒烟了。电平标准不一致,轻则收不到数据,重则烧芯片。这可不是开玩笑的。

咱们平时说的“串口”,大多数时候指的是RS232接口(DB9那种)。但嵌入式设备内部,芯片之间走的往往是TTL电平。工业现场长距离通信,又必须用RS485。所以,搞懂这三者的区别,是做硬件和嵌入式开发的必修课。

2.2 TTL电平——芯片内部的最爱

TTL(Transistor-Transistor Logic)电平,是UART最原始的形态。逻辑1约2.4V~5V,逻辑0约0V~0.8V。单端信号(一根信号线对地)。

  • 电压范围: 0~5V(3.3V系统也一样,高电平约3.3V)
  • 传输距离: 一般不超过1米,线长了波形就塌了
  • 抗干扰: 较差,共模噪声会直接叠加在信号上
  • 常见场景: MCU与传感器、模块之间的板级通信

技巧: 我习惯在TTL信号线上串一个100Ω电阻,靠近发送端放。可以抑制反射和过冲,尤其是走线超过10cm的时候效果很明显。

2.3 RS232电平——负逻辑的“反着来”

RS232定义了一套负逻辑:逻辑1是-3V~-15V,逻辑0是+3V~+15V。你没看错,电压是反的。而且电平摆幅大,抗干扰能力比TTL强不少。

参数RS232TTL
逻辑1电压-3V ~ -15V2.4V ~ 5V
逻辑0电压+3V ~ +15V0V ~ 0.8V
传输距离约15米(标准)小于1米
信号类型单端单端
常用电平转换芯片MAX232、SP3232无需转换

我记得刚接触RS232时,总搞不清正负逻辑。用示波器一看,空闲状态是负电压,发送起始位时突然跳到正电压——这才理解为什么叫“负逻辑”。

避坑指南: 我曾经用万用表量RS232的Tx引脚,没加负载时电压是±12V,但接了线之后可能会被拉到±5V,这是正常的。有些便宜的USB转串口线输出电压不够,会导致通信不稳定。

2.4 RS485电平——差分信号,远距离的王者

RS485是差分传输,靠A、B两根线的电压差来判断逻辑。A-B > +200mV是逻辑1,A-B < -200mV是逻辑0。共模电压允许范围-7V~+12V,抗干扰能力极强。

  • 传输距离: 理论1200米(9600bps时)
  • 节点数量: 标准32个节点(半双工),加驱动芯片可达256个
  • 工作模式: 半双工、全双工(需4线)
  • 常用芯片: MAX485、SP485、SN75176

你想想看,为什么工厂里到处是RS485?因为干扰大、距离远,TTL根本扛不住。RS232虽然也可以,但只有一对收发线,没法组网。

重要: RS485总线需要加终端电阻!在总线最远两端各并一个120Ω电阻。我之前偷懒没加,结果十几米的线缆反射严重,数据错误率高达30%。加上电阻后立马稳定。

2.5 怎么选?一张图帮你决策

下面这张SVG图,我总结成了选择流程。你从UART核心出发,根据距离、抗干扰、组网需求,很快就能找到对应的物理层方案。

UART物理层电平标准选择图 UART核心 TTL (0~5V) RS232 (±12V) RS485 (差分) 适用场景 板级通信,1米内 低干扰,低成本 MCU ↔ 传感器/模块 适用场景 15米内,点对点 PC ↔ 设备,调试口 DB9接头,负逻辑 适用场景 1200米,多节点 工业现场,强干扰 双绞线,差分传输 距离远、干扰大 → 选RS485;距离近、调试 → 选RS232;板内通信 → 选TTL

2.6 电平转换:必要的“翻译官”

实际项目中,很少直接用一个电平标准打通全局。比如MCU输出TTL,要连PC的RS232串口,中间就得加电平转换芯片。最经典的是MAX232,内部有电荷泵,把TTL的0/5V转换成RS232的±10V左右。

关键参数: MAX232工作电压5V,只支持一路收发。如果需要3.3V系统,可以用MAX3232。RS485的转换芯片通常带使能引脚(DE/RE),用于控制收发方向。
// 一个简单的RS485收发切换示例(伪代码)
void RS485_SendByte(uint8_t data) {
    DE = 1;  // 使能发送
    RE = 0;
    UART_Send(data);
    delay(1); // 等待发送完成
    DE = 0;   // 切回接收
    RE = 1;
}

我曾经在调试一个485网络时,发现主机发完数据后总线一直没释放,其他节点没法回复。查了半天,原来是DE引脚拉低的不够快,导致总线“占线”。后来在主循环里加了个死等发送完成标志,问题解决。

2.7 三种标准,一张表说清

特性TTLRS232RS485
信号方式单端单端差分
逻辑1电平2.4V~5V-3V~-15VA-B > +200mV
逻辑0电平0V~0.8V+3V~+15VA-B < -200mV
最大距离<1m≈15m≈1200m
节点数1对11对1最多256个
抗干扰能力弱中强
典型芯片直接GPIOMAX232MAX485
电压摆幅约5V约24V约0.4V(差模)

看到这张表,你应该心里有数了。TTL适合板级,RS232适合桌面级,RS485适合工业级。选错了,轻则不通,重则烧板。

最后一个小建议: 如果你做产品设计,尽量在原理图上预留三种电平的兼容接口,哪怕当前只用TTL。我吃过这种亏:产品量产了,客户突然要求加长传输距离,结果板子没法改,只能重新打样,浪费了时间和钱。