UART 硬件引脚与电气特性:从物理层看懂通信
做 UART 调试,第一件事不是看协议,而是看引脚。我见过太多工程师拿着逻辑分析仪抓了一堆波形,结果发现线接错了——这种低级错误,浪费半天时间。所以这一章,咱们把硬件引脚和电气特性彻底讲透。
2.1 核心三根线:TX、RX、GND
UART 通信最少只需要三根线。你想想看,数据要发出去,要收回来,还得有个共同的参考地。就这么简单。
| 引脚 | 全称 | 方向 | 说明 |
|---|---|---|---|
| TX | Transmit | 输出 | 发送数据,接对方的 RX |
| RX | Receive | 输入 | 接收数据,接对方的 TX |
| GND | Ground | 公共 | 信号参考地,必须连接 |
2.2 交叉连接:TX ↔ RX
UART 是点对点通信。A 设备的 TX 必须接 B 设备的 RX,B 设备的 TX 接 A 设备的 RX。这叫交叉连接,也叫「零调制解调器」接法。
我个人的习惯是:画原理图时,在 TX 和 RX 旁边标注「接对方 RX」「接对方 TX」。别笑,我见过有人把 TX 接 TX、RX 接 RX,结果两边都在发,没人听——这不叫通信,这叫吵架。
设备A TX → 设备B RX
设备A RX ← 设备B TX
设备A GND — 设备B GND
2.3 硬件流控:RTS / CTS
有些场景下,光靠三根线不够。比如一个高速发送,一个低速接收,接收方来不及处理,数据就丢了。这时候需要流控。
RTS(Request To Send)和 CTS(Clear To Send)就是干这个的。简单说:
- RTS:我准备好了,你可以发吗?
- CTS:我准备好了,你发吧。
实际工作中,RTS/CTS 用得不多。为什么?因为大部分嵌入式场景下,波特率不高,数据量不大,软件缓冲区够用。但如果你在做高速传输(比如 921600 bps 以上),或者用 DMA 搬运数据,那流控就很有必要了。
2.4 电平标准:TTL / RS232 / RS485
这是最容易搞混的地方。同样是 UART,电平标准不同,硬件完全不兼容。我刚开始做项目时,拿一个 RS232 的串口线去接 TTL 的模块,结果冒烟了——嗯,那次教训很深刻。
| 标准 | 电压范围 | 逻辑1 | 逻辑0 | 典型应用 |
|---|---|---|---|---|
| TTL | 0 ~ 5V / 3.3V | 2.4V ~ VCC | 0 ~ 0.8V | MCU、传感器、模块 |
| RS232 | -15V ~ +15V | -3V ~ -15V | +3V ~ +15V | 工控机、老式设备 |
| RS485 | -7V ~ +12V | A-B > +200mV | A-B < -200mV | 远距离、多节点 |
TTL 电平
最常见。STM32、ESP32、Arduino 这些芯片,基本都是 TTL 电平。3.3V 或 5V,直接连。注意:3.3V 的 TX 接 5V 的 RX 一般没问题,反过来就可能烧引脚。我建议加个电平转换,或者用电阻分压,别省这个钱。
RS232 电平
RS232 用正负电压表示逻辑,和 TTL 完全相反。所以不能直连,必须用 MAX232 这类芯片做电平转换。我记得第一次用 RS232 调试时,逻辑分析仪抓出来的波形是反的——后来才意识到,RS232 的空闲状态是负电压,起始位是正电压,跟 TTL 正好相反。
RS485 电平
RS485 是差分信号,用两根线(A 和 B)的电压差表示数据。抗干扰能力强,传输距离远(1200米以上),支持多节点(最多 256 个)。但 RS485 是半双工的,同一时刻只能发或收。做 RS485 时,一定要处理好收发切换的时序,否则数据会撞车。
2.5 知识结构图:UART 硬件引脚与电气特性
下面这张图把本章的核心知识点串起来了。你可以把它当作调试时的快速参考。
2.6 实战避坑清单
最后,我把自己这些年踩过的坑整理成一份清单。你调试时对照着检查,能省不少时间。
- GND 没接——数据乱码、通信不稳定。先量一下两个设备之间的地电位差,超过 0.5V 就要小心。
- TX/RX 接反——两边都在发,没人听。用逻辑分析仪抓一下,看 TX 脚有没有波形就知道了。
- 电平不匹配——3.3V 接 5V 一般能用,但 5V 接 3.3V 可能烧引脚。RS232 和 TTL 混接必出问题。
- RS485 收发切换太慢——数据头几个字节丢失。用示波器看 DE/RE 引脚和 TX 的时序关系。
- 流控信号没接——高速传输时丢数据。如果软件流控(XON/XOFF)也不开,那就只能降波特率。