1. UART概述:串行通信与并行通信的区别、UART的历史与演进、UART在嵌入式系统中的地位
1.1 串行通信 vs 并行通信:一场关于“车道”的博弈
聊UART之前,咱们得先搞清楚一个基础问题:串行和并行到底差在哪?
打个比方你就明白了。并行通信就像一条8车道的高速公路,一次能并排跑8辆车(8位数据)。串行通信呢,就是一条单车道,车得一辆接一辆过。你可能会想:“那肯定并行快啊,车道多嘛!”
嗯,理论上没错。但现实世界没那么简单。
核心差异:并行通信虽然单次吞吐量大,但需要更多的信号线(数据线+时钟线+控制线),而且线之间还会互相干扰。串行通信只需要一两根线,布线简单,抗干扰能力强。
我在一个老项目中就吃过亏。当时为了追求速度,用了16位并行总线连接两个板卡。结果呢?信号线太多,PCB布线绕来绕去,时序怎么也调不对。最后换成UART串行通信,两根线搞定,虽然速率降了点,但系统稳定多了。
来,看个对比表更清楚:
| 对比项 | 串行通信 | 并行通信 |
|---|---|---|
| 信号线数量 | 1~2根(如UART的TX/RX) | 8根以上(数据线+控制线) |
| 传输距离 | 远(可达数米甚至更远) | 近(通常<1米) |
| 抗干扰能力 | 强 | 弱(线间串扰严重) |
| 硬件成本 | 低 | 高(连接器、线缆都贵) |
| 典型速率 | 几百bps~数Mbps | 数十Mbps~Gbps |
| 典型应用 | 调试口、传感器、GPS模块 | 内存总线、LCD接口 |
说白了,串行通信是用时间换空间——牺牲单次传输的数据量,换来更少的引脚和更远的距离。而并行通信是空间换时间——用更多的线换更高的吞吐。
你想想看,为什么现在USB、以太网、PCIe这些高速接口全是串行的?因为串行通信可以通过提高时钟频率来弥补带宽,而且信号完整性更好。并行通信到了高频阶段,那真是噩梦。
1.2 UART的历史与演进:从电传到物联网
UART的全称是Universal Asynchronous Receiver/Transmitter,通用异步收发器。这玩意儿的历史可比你想象的要久远。
最早可以追溯到19世纪的电报系统。没错,就是摩尔斯电码那个时代。电报本质上就是一种串行通信——通过一根线,按时间顺序发送“点”和“划”。
到了20世纪60年代,计算机开始普及,人们需要一种标准化的方式来连接终端和调制解调器。于是,RS-232标准诞生了。1969年,EIA(电子工业协会)正式发布了RS-232标准,定义了串行通信的电气特性、信号功能和机械接口。
我记得刚入行那会儿,工位上还摆着一台老式的DB9串口鼠标。那时候的电脑后面必有一个9针的串口,用来接鼠标、Modem或者调试设备。现在的新电脑上你基本找不到串口了,但UART这个协议内核却活了下来。
UART芯片本身也经历了几代演变:
- 第一代:分立元件时代——用移位寄存器、计数器搭出来的UART,体积大、功耗高。
- 第二代:专用芯片时代——如经典的8250/16550,集成在PC主板上,带FIFO缓冲。
- 第三代:MCU集成时代——现在的单片机几乎都内置了UART外设,配置几个寄存器就能用。
- 第四代:高速/低功耗时代——如UART over USB、蓝牙串口透传,速率可达数Mbps。
一个小知识:16550芯片引入了16字节的FIFO,这在当时是个大突破。没有FIFO的话,CPU每收到一个字节就要中断一次,效率极低。现在MCU里的UART基本都带FIFO,有的甚至支持DMA。
UART协议本身其实很简单,就是规定了数据帧的格式:起始位、数据位、校验位、停止位。但正是这种简单,让它成为了嵌入式系统中最通用的“最后手段”——不管是什么芯片,只要有个串口,就能通信。
1.3 UART在嵌入式系统中的地位:为什么它还没被淘汰?
你可能会问:“现在都2025年了,USB、以太网、WiFi满天飞,UART这种老古董还有啥用?”
我跟你讲,UART不仅有用,而且是嵌入式工程师的必备技能。原因有三:
- 调试利器——几乎所有MCU都通过UART输出调试信息。printf打印到串口,这是最原始也最有效的调试手段。没有串口,你连芯片跑没跑起来都不知道。
- 兼容性之王——GPS模块、蓝牙模块、LoRa模块、4G模块、传感器……这些外设的默认通信接口基本都是UART。你想想看,一个协议能连接这么多不同的设备,这本身就是一种生态优势。
- 简单可靠——UART不需要时钟线,不需要复杂的协议栈,两根线就能通信。在资源受限的MCU上,这是最省资源的方案。
避坑指南:我曾经在一个项目中,用UART连接一个工业传感器,结果数据总是丢字节。查了半天,发现是波特率误差累积导致的。UART的波特率是靠时钟分频产生的,如果两个设备的时钟精度不够,或者分频系数不是整数,就会产生误差。建议:尽量使用整数分频的波特率(如115200、57600),避免使用非标准波特率。
下面这张图展示了UART在嵌入式系统中的典型位置:
从这张图你能看出来,UART在嵌入式系统里扮演的是“万能胶”的角色。它连接着MCU和外部世界——无论是调试、传感器采集、无线通信,还是与上位机交互,UART都是最常用的接口。
我个人习惯是,每做一个新项目,第一件事就是先把UART调通。因为只要串口能打印东西,后面的事情就好办了。你想想看,如果连printf都出不来,你怎么知道系统跑没跑起来?
嗯,这里要强调一点:UART虽然简单,但细节决定成败。波特率匹配、电平转换、流控配置、中断处理……任何一个环节出问题,都会导致通信失败。这也是为什么我要专门开这门课,带你从原理到实战,把UART吃透。