串口通信基础: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%以上。

知识体系总览

下面这张图把本章的核心逻辑串起来了:

串口通信基础知识体系 串口通信 RS-232 标准 TTL 电平 通信参数 电气特性:±12V 负逻辑 接口:DB9(3线/9线) 距离:约15米 电气特性:0V/3.3V 或 0V/5V 逻辑:正逻辑(1=高电平) 转换芯片:MAX232/CH340 波特率:9600/115200 数据位:7/8位 停止位:1/2位 校验位:无/奇/偶 核心:收发双方参数必须完全一致

实际调试中的常见问题

最后分享几个我踩过的坑:

  1. 乱码问题:90%是波特率不匹配。先确认收发双方的波特率设置是否一致。
  2. 收不到数据:检查TX和RX有没有接反。很多人把TX接TX、RX接RX,这是错的——要交叉连接。
  3. 偶尔丢数据:可能是没有共地。串口通信必须共地,GND一定要连上。
  4. 烧录失败:除了检查参数,还要看目标芯片是否处于烧录模式。有些芯片需要拉低某个引脚才能进入烧录状态。

调试利器:用逻辑分析仪抓波形,一眼就能看出波特率对不对、数据对不对。我包里常备一个8通道的逻辑分析仪,几十块钱,比示波器方便多了。

串口通信看起来简单,但细节决定成败。把这一章的内容吃透,后面讲烧录协议时你就能理解为什么有些步骤是必须的,有些参数是固定的。