4、UART硬件引脚:TX、RX、GND、RTS、CTS的功能与连接方式,以及NULL Modem接线法
讲UART,很多人上来就写代码。但我个人习惯,先看原理图,再拿万用表量引脚。你想想看,代码写得再漂亮,硬件没接对,数据根本出不去。这一章我们就来把UART那几个物理引脚彻底搞清楚。
4.1 核心三根线:TX、RX、GND
最基本的UART通信,只需要三根线。少了不行,多了浪费。这三根线是:
- TX (Transmit):发送数据线。数据从这里发出去。
- RX (Receive):接收数据线。数据从这里收进来。
- GND (Ground):信号地。提供共同的参考电平。
这里有个最常见的坑——交叉连接。设备A的TX必须接设备B的RX,设备A的RX接设备B的TX。我刚开始做嵌入式那会儿,拿着一个USB转串口模块去调试一个传感器模块,焊好线,上电,死活读不到数据。折腾了半小时,最后发现TX接TX、RX接RX了。嗯,这就是典型的“直连”错误。
4.2 硬件流控引脚:RTS与CTS
当数据量大了,或者两个设备处理速度不匹配时,就需要硬件流控。说白了,就是让接收方告诉发送方:“你慢点,我快吃不消了。” 或者 “好了,你可以继续发了。”
这两个引脚是:
- RTS (Request to Send):请求发送。由接收方控制,告诉对方“我准备好了,你可以发数据了”。
- CTS (Clear to Send):清除发送。由发送方检测,收到这个信号才允许发数据。
实际连接时,RTS和CTS也是交叉的:设备A的RTS接设备B的CTS,设备A的CTS接设备B的RTS。这样接收方通过拉低RTS来通知发送方暂停,发送方通过检测CTS电平来决定是否继续发送。
4.3 引脚功能对比表
| 引脚 | 全称 | 方向 | 功能描述 |
|---|---|---|---|
| TX | Transmit | 输出 | 发送串行数据 |
| RX | Receive | 输入 | 接收串行数据 |
| GND | Ground | - | 信号地,共参考电平 |
| RTS | Request to Send | 输出 | 请求发送,由接收方控制 |
| CTS | Clear to Send | 输入 | 清除发送,由发送方检测 |
4.4 标准连接方式
最常用的连接方式有两种:三线制和五线制。
- 三线制:TX ↔ RX、RX ↔ TX、GND ↔ GND。适用于大多数低速、短距离场景。
- 五线制:在三线制基础上,加上RTS ↔ CTS、CTS ↔ RTS。适用于高速、大数据量、需要流控的场景。
我个人习惯,在开发板上调试时,先用三线制把通信调通,再根据实际需求决定要不要加流控。这样能快速定位问题是出在硬件连接还是软件协议上。
4.5 NULL Modem接线法
NULL Modem,直译过来就是“无调制解调器”。早期计算机通过Modem连接时,需要完整的RS-232信号。但两台设备直接相连时,不需要Modem,所以需要一种特殊的交叉接线方式,模拟Modem的存在。这就是NULL Modem的由来。
NULL Modem的核心思想就是:让两个DTE设备(数据终端设备)直接通信。常见的NULL Modem接线方式有:
- 最小化接线:只接TX、RX、GND三根线。这是最简方案。
- 带硬件流控的接线:TX ↔ RX、RX ↔ TX、GND ↔ GND、RTS ↔ CTS、CTS ↔ RTS。
- 全握手接线:除了上述五根线,还包含DSR、DTR、DCD等信号线的交叉连接。这种在工业设备中比较常见。
4.6 知识结构图:UART引脚连接逻辑
下面这张图展示了UART引脚的核心连接逻辑,以及NULL Modem的接线关系。你可以把它当作一个快速参考。
4.7 接线时的注意事项
最后,分享几个我踩过的坑,希望能帮你省点时间:
- 电平标准要一致:3.3V的设备不能直接接5V的UART,除非有电平转换芯片。我曾经因为没注意这个,烧了一个传感器的RX引脚。
- 长距离传输要降波特率:超过1米,建议用9600或更低。115200在3米线上经常丢包。
- NULL Modem不是万能药:有些设备需要特定的握手信号,比如DTR/DSR。如果只接TX/RX/GND不行,查手册看看是不是需要额外的信号线。
- 用万用表量一下:上电前,先测一下TX和RX引脚的电平,确保没有短路。我习惯用万用表的二极管档,测一下对地电阻,正常应该在几百kΩ以上。