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,三根线搞定。
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常用)。但底层的帧结构,基本没变过。
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:适合多设备、低速的场景。两根线能挂上百个设备,但协议复杂,速率上不去。
下面这张图帮你理清三者的选择逻辑:
1.4 为什么UART在嵌入式领域依然坚挺?
你可能要问:SPI比UART快,I2C比UART灵活,为什么UART还是每个板子上的标配?
我自己的体会是——调试。你想想,一个新板子拿回来,SPI和I2C都得先初始化、配寄存器、写驱动才能用。但UART呢?接上串口工具,打开终端,直接就能打印信息。这种“即插即用”的体验,是其他协议给不了的。
另外,UART的容错性也很好。我曾经在一条长10米的RS-485总线上跑UART,波特率9600,线缆就是普通的双绞线,没有任何终端匹配电阻,照样稳定跑了好几年。换成SPI?3米就出问题了。