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物理层选型流程

下面这张图帮你理清思路:拿到一个项目,怎么选物理层标准。

UART物理层选型决策流程 通信距离 & 环境 距离 < 1m 且 板级通信? 是 TTL 电平 否 距离 > 10m 或 工业环境? 是 RS-485 差分 否 RS-232 标准 选型要点 • TTL:板级调试、短距离传感器 • RS-232:老设备对接、调试终端 • RS-485:工业总线、多机通信、远距离

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用工业远距离。电平转换芯片选对型号,电容别省,地线别断,通信就稳了。