硬件接口与引脚:从TX/RX到RS232电平转换

做UART驱动开发,第一件事就是搞清楚物理层在干什么。说白了,你得知道数据从芯片出来,经过什么路径,最后到了对端设备。我见过不少新手,上来就写寄存器,结果示波器一抓波形全是乱的——问题往往出在引脚连接和电平匹配上。

这一节,咱们把硬件接口的底裤扒干净。从最基本的TX/RX引脚,到RS232和TTL电平的差异,再到DB9连接器怎么定义,最后聊聊流控信号RTS/CTS。嗯,都是实战里绕不开的东西。

TX/RX引脚功能

UART通信就两根数据线:TX(发送)和RX(接收)。名字很直白——TX发数据,RX收数据。但有个关键点:交叉连接。你的TX要接对方的RX,你的RX要接对方的TX。这叫全双工,两边能同时说话。

核心原则:设备A的TX → 设备B的RX;设备A的RX ← 设备B的TX。千万别接成TX对TX,RX对RX——那样数据全怼一块儿,谁也收不到。

我在项目里遇到过一件事:调试一块工业控制板,串口死活不通。查了半天,发现硬件工程师把DB9的2脚和3脚画反了。嗯,这种低级错误其实挺常见的。你写驱动前,最好拿万用表量一下板子上的TX和RX,确认物理连接没问题。

RS232电平与TTL电平转换

这里有个坑,很多人一开始搞不明白。UART本身是数字逻辑,但通信距离一长,TTL电平就不够用了。

电平标准 逻辑1(高电平) 逻辑0(低电平) 典型电压范围
TTL 2.0V ~ 5.0V 0V ~ 0.8V 0 ~ 5V
RS232 -3V ~ -15V +3V ~ +15V ±12V 典型

看到了吗?RS232的逻辑电平是反的,而且电压范围完全不同。TTL的1是正电压,RS232的1是负电压。所以你不能直接把MCU的TX引脚怼到RS232接口上——会烧芯片的。

解决办法很简单:加一颗电平转换芯片。比如MAX232、SP3232这类,内部有电荷泵,能把TTL电平转成RS232电平,同时把RS232电平转回TTL。我习惯在原理图上把转换芯片放在靠近DB9连接器的位置,这样走线短,抗干扰好。

实战建议:选型时注意转换芯片的供电电压。3.3V系统用MAX3232,5V系统用MAX232。别混用,否则电平可能不达标。

DB9连接器定义

DB9是RS232最常用的物理接口。9个引脚,但实际UART通信只用其中几个。你想想看,很多设备只接了TX、RX和GND就能跑,剩下的引脚要么悬空,要么做流控。

下面是标准的DB9引脚定义(DTE设备,比如PC):

引脚号 信号 方向 说明
1 DCD 输入 载波检测
2 RXD 输入 接收数据
3 TXD 输出 发送数据
4 DTR 输出 数据终端就绪
5 GND - 信号地
6 DSR 输入 数据设备就绪
7 RTS 输出 请求发送
8 CTS 输入 清除发送
9 RI 输入 振铃指示

注意:DB9的2脚和3脚在DTE和DCE设备上是反的。PC是DTE,所以2是RX、3是TX。如果你接一个DCE设备(比如Modem),就需要用直连串口线;如果两个DTE设备对接,就得用交叉串口线。我刚开始做项目时,就因为这个搞混过,焊了好几根线才试出来。

流控信号RTS/CTS

流控分两种:硬件流控和软件流控。咱们重点说硬件流控,也就是RTS/CTS。

RTS(Request to Send)是发送方告诉接收方:“我要发数据了,你准备好没?”
CTS(Clear to Send)是接收方回复:“准备好了,发吧。”

流程是这样的:

  1. 设备A拉高RTS,表示想发数据。
  2. 设备B如果缓冲区有空位,就拉高CTS,表示可以发。
  3. 设备A看到CTS为高,开始发送数据。
  4. 如果设备B缓冲区快满了,就拉低CTS,设备A停止发送。

说白了,这就是一种握手协议。没有流控时,如果接收方处理不过来,数据就会丢失。我遇到过一个问题:一个高速传感器每秒发1000帧数据,MCU的接收缓冲区只有64字节,没开流控,结果丢包率超过30%。后来加上RTS/CTS,问题就解决了。

注意:不是所有UART外设都支持硬件流控。用之前查一下芯片手册,看RTS/CTS引脚是否独立,还是和GPIO复用。另外,流控线必须交叉连接:设备A的RTS接设备B的CTS,设备A的CTS接设备B的RTS。

知识结构图:UART硬件接口全景

下面这张图把本节的核心知识点串起来了。从MCU内部的UART外设,到TX/RX引脚,再到电平转换芯片,最后到DB9连接器。流控信号RTS/CTS也画进去了。

UART硬件接口与引脚知识结构图 UART硬件接口与引脚知识结构 MCU UART 外设 TX / RX 引脚 电平转换芯片 DB9 连接器 RTS / CTS 流控 关键说明 • TX/RX 必须交叉连接:设备A的TX → 设备B的RX • TTL电平(0~5V)与RS232电平(±12V)不能直连,需转换芯片 • DB9的2脚(RX)和3脚(TX)在DTE/DCE设备上定义不同 • RTS/CTS 流控线也要交叉连接,用于防止接收缓冲区溢出 • 实际项目中最少连接:TX、RX、GND 三根线即可通信

实战中的几个要点

  • 电平匹配:MCU是3.3V还是5V?RS232接口需要±12V?中间必须加转换芯片。我曾经用电阻分压代替转换芯片,结果通信距离超过2米就丢数据——别省这个钱。
  • 引脚复用:很多MCU的UART引脚和GPIO、SPI共用。配置寄存器时,记得把引脚功能切换到UART模式。我见过有人初始化了UART外设,但忘了配置引脚复用,结果TX/RX一直输出高电平。
  • 地线必须接:GND是所有信号的参考点。不接地线,电平就没法对齐。两个设备之间如果地电位差太大,还可能烧毁接口芯片。
  • 流控不是必须的:低速通信(9600bps以下)或者数据量不大时,可以不用流控。但高速通信(115200bps以上)或者数据量密集时,建议加上。我一般会在设计时预留RTS/CTS引脚,调试时根据情况决定是否启用。

调试小技巧:用示波器抓TX和RX引脚的波形,可以快速判断电平是否正常。TTL电平的波形应该在0V和3.3V(或5V)之间跳变;RS232电平的波形应该在-12V和+12V之间跳变。如果波形幅度不对,先查电平转换芯片的供电和引脚连接。

好了,硬件接口这部分就聊到这儿。你把这些搞清楚了,后面写驱动的时候心里就有底了。电平转换、引脚连接、流控配置——每一步都踩实了,UART通信才能稳。