2、UART物理层:RS-232、RS-485、TTL电平标准详解与电平转换芯片实战
各位同学,咱们今天聊聊UART的物理层。说白了,就是数据在线上到底怎么跑,电压多高,怎么连。很多初学者写驱动时,代码逻辑都对,但就是通信不上,十有八九是物理层没搞对。我当年刚入行时也栽过这个跟头,所以这一章咱们把它彻底讲透。
2.1 三种电平标准:TTL、RS-232、RS-485
UART协议本身只定义了数据帧格式(起始位、数据位、校验位、停止位),但它没规定电压是多少。于是就有了不同的物理层标准。最常用的就这三种:TTL、RS-232、RS-485。
| 特性 | TTL (3.3V/5V) | RS-232 | RS-485 |
|---|---|---|---|
| 信号电压 | 0V ~ VCC | ±3V ~ ±15V | 差分 ±1.5V ~ ±6V |
| 逻辑1 | VCC (3.3V或5V) | -3V ~ -15V | A-B > +200mV |
| 逻辑0 | 0V (GND) | +3V ~ +15V | A-B < -200mV |
| 传输距离 | <1米(板级) | 约15米 | 可达1200米 |
| 通信方式 | 单端,共地 | 单端,共地 | 差分,半双工/全双工 |
| 典型应用 | MCU内部、传感器 | 老式PC串口、工控 | 工业总线、多机通信 |
核心区别一句话总结:TTL是芯片内部用的,RS-232是早期电脑串口用的,RS-485是工业远距离抗干扰用的。
2.2 TTL电平:最基础的UART接口
TTL电平是MCU、传感器之间最常用的方式。逻辑1就是电源电压(3.3V或5V),逻辑0就是GND(0V)。简单直接,但抗干扰能力差。
为什么TTL不能传远?你想想看,信号在线上传输时,线缆本身有电阻和电容,电压会衰减。再加上外部电磁干扰,3.3V的信号可能被干扰成2.0V,接收端就分不清是1还是0了。所以TTL通常只用在板级通信,线长不超过30厘米。
我的经验:做STM32或ESP32开发时,串口调试用的就是TTL电平。USB转TTL模块(比如CH340、CP2102)直接连MCU的TX/RX,GND共地就行。但注意——3.3V的MCU绝对不能接5V的TTL设备,会烧引脚。我见过有人把5V的GPS模块直接怼到3.3V的STM32上,结果串口引脚直接冒烟了。
2.3 RS-232:老牌标准,电压摆幅大
RS-232是上世纪60年代的标准,早期电脑的DB9串口就是它。它的逻辑电平跟TTL完全相反:逻辑1是负电压(-3V ~ -15V),逻辑0是正电压(+3V ~ +15V)。
为什么要用这么高的电压?说白了就是为了抗干扰。±12V的摆幅,噪声要干扰它可不容易。所以RS-232能传15米左右。
但有个坑:MCU的UART引脚是TTL电平,不能直接连RS-232设备。必须用电平转换芯片,比如MAX232。我早期做项目时,直接把STM32的TX连到电脑DB9的RX上,结果什么反应都没有。后来查资料才知道,TTL的3.3V在RS-232眼里连逻辑0都算不上。
2.4 RS-485:工业级差分信号
RS-485是工业现场最常用的标准。它用两根线(A和B)传输差分信号,逻辑1是A-B > +200mV,逻辑0是A-B < -200mV。
差分信号的好处是什么?两根线绞在一起,外部干扰对两根线的影响几乎相同,接收端只看差值,所以共模干扰被抵消了。这就是为什么RS-485能传1200米,还能挂256个设备。
RS-485通常是半双工的,一根总线上的设备分时发送。需要使能控制引脚(DE/RE)来切换收发方向。很多初学者忘了控制方向,导致数据发不出去或收不到。
避坑指南:RS-485总线两端必须加120Ω终端电阻,否则信号反射会导致数据错乱。我曾经在一个项目中,总线长度300米,没加终端电阻,结果通信时好时坏,排查了两天才找到原因。
2.5 电平转换芯片:MAX232的使用
MAX232是经典的RS-232电平转换芯片。它内部有电荷泵,能把5V电源转换成±10V左右的RS-232电平。
典型电路连接:
MCU (TTL) MAX232 DB9 (RS-232)
TX ──────────→ T1IN T1OUT ──────→ RX (Pin 2)
RX ←────────── R1OUT R1IN ←────── TX (Pin 3)
GND ──────────→ GND GND (Pin 5)
MAX232需要外接4个电解电容(通常是1μF或0.1μF),用于电荷泵的升压和稳压。电容接法如下:
- C1+ 和 C1- 之间接电容
- C2+ 和 C2- 之间接电容
- V+ 和 GND 之间接电容
- V- 和 GND 之间接电容
我的习惯:电容用1μF的钽电容或电解电容,耐压16V以上。别用陶瓷电容,电荷泵工作时纹波会大一些。另外,MAX232的VCC引脚一定要加0.1μF去耦电容,靠近芯片放置。
2.6 三种标准的互连方案
实际项目中,经常需要在不同标准之间转换。我整理了一张互连对照表:
| 源端 | 目标端 | 转换方案 |
|---|---|---|
| TTL (3.3V) | TTL (5V) | 电平转换芯片(如TXS0108)或分压电阻 |
| TTL | RS-232 | MAX232 / MAX3232 |
| TTL | RS-485 | MAX485 / SP3485 |
| RS-232 | TTL | MAX232(双向转换) |
| RS-232 | RS-485 | RS-232转RS-485转换器(如ADM2483) |
2.7 知识结构图:UART物理层选型流程
下面这张图帮你理清思路:拿到一个项目,怎么选物理层标准。
2.8 实战经验:电平转换电路设计要点
最后,分享几个我在项目中踩过的坑和总结的经验:
- 共地是必须的:无论TTL、RS-232还是RS-485,通信双方必须共地。不共地的话,电平参考点不同,数据必错。我见过有人用RS-485传了500米没接地线,结果数据全是乱码。
- MAX232的电容别省:有些同学为了省成本,用0.1μF的陶瓷电容代替1μF电解电容。结果电荷泵带载能力下降,RS-232电平摆幅不够,通信不稳定。
- RS-485的使能引脚:半双工模式下,发送时使能DE,接收时使能RE。很多驱动代码里忘了切换方向,导致数据发不出去。我习惯用定时器或中断来精确控制使能时序。
- 电平转换芯片选型:3.3V系统用MAX3232(兼容3.3V),5V系统用MAX232。别混用,否则电平不匹配。
一句话总结:物理层选型看距离和环境,TTL用板级,RS-232用短距离,RS-485用工业远距离。电平转换芯片选对型号,电容别省,地线别断,通信就稳了。