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了。嗯,这就是典型的“直连”错误。

⚠️ 避坑指南: 我曾经在调试一块工业控制板时,因为GND没接,两个设备的地电位差了将近2V,结果串口芯片直接冒烟了。记住:GND必须接,它不仅是参考地,更是电流回流的路径。不接GND,信号电平就是浮空的,数据根本不可靠。

4.2 硬件流控引脚:RTS与CTS

当数据量大了,或者两个设备处理速度不匹配时,就需要硬件流控。说白了,就是让接收方告诉发送方:“你慢点,我快吃不消了。” 或者 “好了,你可以继续发了。”

这两个引脚是:

  • RTS (Request to Send):请求发送。由接收方控制,告诉对方“我准备好了,你可以发数据了”。
  • CTS (Clear to Send):清除发送。由发送方检测,收到这个信号才允许发数据。

实际连接时,RTS和CTS也是交叉的:设备A的RTS接设备B的CTS,设备A的CTS接设备B的RTS。这样接收方通过拉低RTS来通知发送方暂停,发送方通过检测CTS电平来决定是否继续发送。

💡 个人经验: 我建议在项目初期,如果数据量不大(比如每秒几十个字节),直接用三线制(TX/RX/GND)就够了。硬件流控虽然可靠,但多两根线,多两个GPIO,调试起来也麻烦。等到你发现数据偶尔丢包、乱码,再考虑加上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等信号线的交叉连接。这种在工业设备中比较常见。
🔧 实战经验: 我在调试一个老款PLC时,对方用的是DB9接口,但只引出了TX、RX、GND三根线。我按照标准NULL Modem接线,把RTS和CTS也接了,结果PLC那边根本没反应。后来查手册才发现,那个PLC的RTS和CTS引脚是悬空的。所以,接线前一定要看设备手册,别想当然。

4.6 知识结构图:UART引脚连接逻辑

下面这张图展示了UART引脚的核心连接逻辑,以及NULL Modem的接线关系。你可以把它当作一个快速参考。

UART引脚连接与NULL Modem接线逻辑 UART引脚连接与NULL Modem接线逻辑 设备A (DTE) TX (输出) RX (输入) GND RTS (输出) CTS (输入) 设备B (DTE) TX (输出) RX (输入) GND RTS (输出) CTS (输入) TX→RX RX←TX GND RTS→CTS CTS←RTS NULL Modem接线核心 TX↔RX交叉连接,RTS↔CTS交叉连接,GND直连

4.7 接线时的注意事项

最后,分享几个我踩过的坑,希望能帮你省点时间:

  • 电平标准要一致:3.3V的设备不能直接接5V的UART,除非有电平转换芯片。我曾经因为没注意这个,烧了一个传感器的RX引脚。
  • 长距离传输要降波特率:超过1米,建议用9600或更低。115200在3米线上经常丢包。
  • NULL Modem不是万能药:有些设备需要特定的握手信号,比如DTR/DSR。如果只接TX/RX/GND不行,查手册看看是不是需要额外的信号线。
  • 用万用表量一下:上电前,先测一下TX和RX引脚的电平,确保没有短路。我习惯用万用表的二极管档,测一下对地电阻,正常应该在几百kΩ以上。
🔍 调试小技巧: 如果你不确定接线是否正确,可以用一个USB转串口模块,接上TX和RX,打开串口助手,发一个字符。如果模块的TX灯闪烁,说明数据发出去了。再用示波器看RX引脚,如果有波形,说明对方有回应。这样一步步排查,比瞎猜快得多。