1. UART协议概述:串行通信基础

各位同学,咱们今天正式开讲UART。说实话,我做了十几年嵌入式驱动,UART是我用得最多的接口,没有之一。它简单、可靠、几乎无处不在——从你手边的MCU调试口,到GPS模块、蓝牙模组、工业传感器,背后都是UART在干活。

这一章咱们先打好地基。我会从串行通信最基础的概念讲起,再聊聊UART是怎么一步步演变成今天这个样子的,最后拿它跟SPI、I2C做个对比。这样你心里就有谱了:什么场景该用UART,什么场景该换别的。

1.1 串行通信 vs 并行通信

先问个问题:为什么叫“串行”?说白了,就是数据一根线挨个儿传。一次只传一个bit,像排队过安检一样,一个接一个走。

与之对应的是并行通信——一次传8位、16位甚至更多。听起来并行更快对吧?但实际工程中,并行有个致命问题:线间串扰。我记得刚入行时调过一个并行LCD接口,8根数据线稍微没等长,画面就花得一塌糊涂。从那以后我就明白了,为什么远距离通信几乎全是串行的天下。

特性 串行通信 并行通信
传输线数 1~2根 8根以上
抗干扰能力 强(线少,串扰小) 弱(线多,串扰大)
传输距离 远(可达几十米) 近(通常<1米)
典型速率 几百bps~几Mbps 几十Mbps~几Gbps
硬件成本 低 高

UART属于异步串行通信。什么叫异步?就是收发双方没有独立的时钟线,靠约定的波特率来同步。你想想看,省掉一根时钟线,硬件连接就简单多了——TX、RX、GND,三根线搞定。

我的经验:调试阶段,我习惯在TX/RX上各串一个100Ω电阻。万一接反了或者短路了,电阻能挡住大部分电流,芯片不容易烧。这招救过我至少三次。

1.2 UART的历史与演进

UART的历史其实挺有意思的。最早可以追溯到1960年代的电传打字机——没错,就是那种带键盘的打印机。当时需要一种方式把键盘敲击转换成电信号传出去,UART的雏形就这么来了。

真正让UART普及的是1980年代的PC时代。IBM PC上用的8250 UART芯片,后来升级到16550——这个型号你肯定听过。16550最大的贡献是加入了16字节FIFO。为什么重要?因为之前没有FIFO时,CPU每收到一个字节就得去处理一次中断。波特率一高,CPU就被中断淹没了。有了FIFO,可以攒够一批再通知CPU,效率翻了好几倍。

我个人觉得,UART能活到现在,核心原因就两个:

  • 协议极简——没有复杂的握手,没有地址帧,没有时钟同步
  • 硬件普遍——几乎每颗MCU都内置UART外设,成本几乎为零

到了今天,UART的变种也很多:RS-232(±12V电平)、RS-485(差分信号,抗干扰强)、TTL UART(0~3.3V/5V,MCU常用)。但底层的帧结构,基本没变过。

核心要点:不管电平标准怎么变,UART的数据帧结构——起始位、数据位、校验位、停止位——从1960年代到现在,几乎没有变化。这就是经典协议的生命力。

1.3 UART vs SPI vs I2C:三巨头对比

做嵌入式开发,这三兄弟你迟早都得打交道。我经常被问到:“到底该用哪个?”我的回答是:没有最好的,只有最合适的。

咱们直接上对比表,一目了然:

对比项 UART SPI I2C
信号线数 2(TX/RX) 4(SCLK/MOSI/MISO/CS) 2(SCL/SDA)
通信方式 异步 同步 同步
主从结构 点对点(无主从) 一主多从 多主多从
最大速率 ~1Mbps(典型) ~50Mbps+ ~3.4Mbps(高速模式)
传输距离 远(RS-485可达千米) 短(<1米) 短(<1米)
硬件复杂度 低 中 中(需上拉电阻)
典型场景 调试口、GPS、蓝牙 ADC、LCD、SD卡 传感器、EEPROM

我来帮你拆解一下这张表:

  • UART:适合两个设备之间的简单通信。不需要选片,不需要时钟,插上就能聊。但缺点也很明显——只能点对点,不能挂多个设备。
  • SPI:适合高速、大数据量的场景。全双工,速率高,但每加一个从设备就要多一根CS线,线多了就头疼。
  • I2C:适合多设备、低速的场景。两根线能挂上百个设备,但协议复杂,速率上不去。
避坑提醒:我曾经在一个项目里用UART接了三个传感器,想着分时复用一根TX线。结果数据一多就打架,调试了整整两天。后来老老实实换了I2C,半小时搞定。记住——UART天生就是点对点的,别硬搞成总线。

下面这张图帮你理清三者的选择逻辑:

串行通信协议选型决策图 需要串行通信? 点对点通信? 多设备通信? UART(首选) 高速?→ SPI 低速?→ I2C 选型建议: • 两个设备、简单通信、调试口 → UART • 高速、大数据、一主多从 → SPI • 多设备、低速、省引脚 → I2C

1.4 为什么UART在嵌入式领域依然坚挺?

你可能要问:SPI比UART快,I2C比UART灵活,为什么UART还是每个板子上的标配?

我自己的体会是——调试。你想想,一个新板子拿回来,SPI和I2C都得先初始化、配寄存器、写驱动才能用。但UART呢?接上串口工具,打开终端,直接就能打印信息。这种“即插即用”的体验,是其他协议给不了的。

另外,UART的容错性也很好。我曾经在一条长10米的RS-485总线上跑UART,波特率9600,线缆就是普通的双绞线,没有任何终端匹配电阻,照样稳定跑了好几年。换成SPI?3米就出问题了。

小技巧:新板子调试,我永远先确保UART能打印。只要串口能出字,其他外设的调试就有底气了。这叫“调试锚点”——先稳住一个可靠的通信通道,再逐步点亮其他模块。