串口通信基础:RS-232标准、TTL电平与串口参数
做嵌入式开发,打交道最多的就是串口。说它是调试的「生命线」一点不为过。我刚开始接触单片机时,第一件事就是学会怎么用串口打印「Hello World」。但很多人只知其然,不知其所以然——为什么有时候用USB转串口线能通信,有时候就不行?为什么有的设备用3.3V,有的用5V?
这一章,咱们就把串口通信的底裤扒干净。
RS-232标准:老古董但依然坚挺
RS-232标准诞生于上世纪60年代,由电子工业协会(EIA)制定。你想想看,一个60年代的标准,到现在还在用,说明它确实有两把刷子。
RS-232定义了串行通信的电气特性、信号功能和机械接口。最经典的就是DB9接口,9个引脚,但实际通信只需要3根线:
- TXD(发送数据)
- RXD(接收数据)
- GND(信号地)
其他引脚像RTS、CTS、DSR、DTR这些,是硬件流控用的。说实话,我在实际项目中很少用硬件流控,大部分场景下三根线就够了。
RS-232电平标准:
- 逻辑1(Mark):-3V ~ -15V
- 逻辑0(Space):+3V ~ +15V
- 未定义区域:-3V ~ +3V
注意,RS-232用的是负逻辑,和咱们平时理解的正逻辑正好相反。
为什么用这么高的电压?为了抗干扰。±12V的摆幅,在工业环境里跑个十几米没问题。但代价就是功耗大,而且不能直接和单片机连——这就是下面要说的坑。
TTL电平:单片机的母语
咱们单片机用的串口,其实是TTL电平(更准确说是CMOS电平)。它和RS-232完全是两码事:
| 参数 | RS-232 | TTL(5V) | TTL(3.3V) |
|---|---|---|---|
| 逻辑1电压 | -3V ~ -15V | 2.0V ~ 5.0V | 2.0V ~ 3.3V |
| 逻辑0电压 | +3V ~ +15V | 0V ~ 0.8V | 0V ~ 0.8V |
| 逻辑极性 | 负逻辑 | 正逻辑 | 正逻辑 |
| 最大传输距离 | 约15米 | 约1米 | 约1米 |
| 典型电压摆幅 | ±12V | 0V ~ 5V | 0V ~ 3.3V |
看到区别了吧?直接把TTL电平接到RS-232设备上,轻则通信失败,重则烧毁芯片。我曾经就见过一个新手,把3.3V的单片机TX直接怼到电脑的串口上——结果就是一股青烟。
警告:绝对不要将TTL电平直接连接到RS-232接口!必须使用电平转换芯片。
TTL与RS-232电平转换
转换方案其实很简单,最常用的就是MAX232系列芯片。它内部有电荷泵,能把5V升压到±10V左右,完成电平转换。
典型的电路连接:
单片机 TX (TTL) → MAX232 T1IN → MAX232 T1OUT → DB9 Pin 2 (RXD)
单片机 RX (TTL) ← MAX232 R1OUT ← MAX232 R1IN ← DB9 Pin 3 (TXD)
GND → MAX232 GND → DB9 Pin 5 (GND)
现在很多开发板直接集成了USB转串口芯片,比如CH340、CP2102、FT232。这些芯片内部已经做了电平转换,所以你可以直接用USB线连接电脑和开发板。
但要注意一点:这些USB转串口模块输出的电平是3.3V还是5V? 我建议你养成习惯,买模块时看清楚规格。有些模块默认输出5V,接到3.3V的单片机上,虽然大多数芯片能承受,但长期使用有风险。
我的习惯:在调试新板子时,先用万用表量一下USB转串口模块的TX引脚电压。空载时如果测到5V,我会串一个1kΩ电阻限流,或者直接换3.3V版本的模块。
串口通信参数:四要素
串口通信要成功,收发双方必须约定好四个参数。任何一个对不上,出来的就是乱码。
波特率(Baud Rate)
波特率就是每秒传输的符号数。常见的值有:9600、19200、38400、115200、921600。
怎么选?看你的需求:
- 9600:最通用,抗干扰强,适合长距离或噪声环境
- 115200:调试常用,速度适中,大部分场景够用
- 921600:高速传输,但线长超过1米就容易出错
我在项目中遇到过一个问题:用115200波特率烧录固件,总是烧到一半失败。后来发现是USB延长线太长,信号衰减导致误码。降到38400就稳了。
数据位(Data Bits)
数据位表示一个数据帧中实际传输的数据位数。通常是7位或8位。
- 8位:最常用,一个字节正好8位
- 7位:老式ASCII通信用,现在很少见
你想想看,现在谁还用7位数据?除非你在和古董设备通信。默认选8位就对了。
停止位(Stop Bits)
停止位表示一帧数据结束后的空闲时间。常见的是1位、1.5位、2位。
- 1位:最常用,效率最高
- 2位:给接收端更多时间处理,适合低速设备或噪声环境
- 1.5位:只在某些特殊场景用,我做了十年嵌入式都没用过
校验位(Parity Bit)
校验位用于简单的错误检测。有三种模式:
- 无校验(None):不校验,最常用
- 奇校验(Odd):使数据中1的个数为奇数
- 偶校验(Even):使数据中1的个数为偶数
说实话,校验位在低速场景下有点鸡肋。因为串口本身没有重传机制,检测到错误也只能丢弃。真正要可靠传输,得上层协议做校验和重传。
最常用的参数组合: 115200、8N1(8数据位、无校验、1停止位)
这个组合在调试和烧录场景中占了90%以上。
知识体系总览
下面这张图把本章的核心逻辑串起来了:
实际调试中的常见问题
最后分享几个我踩过的坑:
- 乱码问题:90%是波特率不匹配。先确认收发双方的波特率设置是否一致。
- 收不到数据:检查TX和RX有没有接反。很多人把TX接TX、RX接RX,这是错的——要交叉连接。
- 偶尔丢数据:可能是没有共地。串口通信必须共地,GND一定要连上。
- 烧录失败:除了检查参数,还要看目标芯片是否处于烧录模式。有些芯片需要拉低某个引脚才能进入烧录状态。
调试利器:用逻辑分析仪抓波形,一眼就能看出波特率对不对、数据对不对。我包里常备一个8通道的逻辑分析仪,几十块钱,比示波器方便多了。
串口通信看起来简单,但细节决定成败。把这一章的内容吃透,后面讲烧录协议时你就能理解为什么有些步骤是必须的,有些参数是固定的。