1、UART基础:什么是UART?UART的历史、UART与RS232/RS485的区别、UART的应用场景

1.1 什么是UART?—— 串口通信的“老黄牛”

UART,全称是Universal Asynchronous Receiver/Transmitter,通用异步收发器。说白了,它就是一种把数据“串行化”传输的硬件模块。

你想想看,我们平时在单片机里处理数据,都是8位、16位、32位并行的。但数据要传出去,尤其是传个几米甚至几十米,并行线缆又贵又容易受干扰。UART干的事,就是把并行的数据,变成一根线串行发出去,另一根线收回来。

我个人习惯把UART比作“邮局”。你把一封信(8位数据)交给邮局,邮局把它拆成一个个字(起始位、数据位、校验位、停止位),然后按顺序送到对方邮局,对方再拼回一封信。整个过程不需要时钟线,全靠双方约定好的“波特率”来同步。

核心要点:UART是硬件协议,不是软件协议。它规定了数据帧的格式:起始位(1位)、数据位(5~9位,常用8位)、校验位(可选)、停止位(1~2位)。

我在项目中遇到过不少新手,以为UART就是RS232。其实不是。UART是芯片内部的逻辑模块,RS232是电气接口标准。这个区别,后面我会细讲。

1.2 UART的历史——从电传打字机到物联网

UART的历史,其实比很多工程师的年龄都大。它最早可以追溯到20世纪60年代的电传打字机(Teletype)。那时候计算机还是庞然大物,人机交互靠的是打字机。打字机敲一个键,就通过串行线路发一个字符给计算机。

到了70年代,Intel推出了8250 UART芯片,这玩意儿成了PC串口的标配。我记得我刚开始学嵌入式时,用的就是8051单片机,里面集成了UART模块。那时候调试程序,全靠串口打印信息,连个像样的调试器都没有。

后来,16550 UART芯片出现了,它加入了FIFO缓冲区。为什么要加FIFO?因为CPU处理速度越来越快,但串口速度相对慢,如果没有缓冲区,CPU就得频繁响应中断,效率极低。16550的16字节FIFO,一下子让串口通信稳定了很多。

嗯,这里要注意:现在的MCU基本都集成了UART外设,而且FIFO深度也更大。但底层原理,还是那套“起始位+数据位+校验位+停止位”的老规矩。

1.3 UART与RS232/RS485的区别——别搞混了!

这是很多初学者容易混淆的地方。我直接给你一个表格,一目了然:

项目 UART RS232 RS485
本质 逻辑协议(芯片内部) 电气接口标准 电气接口标准
电平 TTL/CMOS(0~3.3V或5V) ±3V ~ ±15V 差分信号(A/B线,电压差)
传输距离 几厘米(板级) 约15米 可达1200米
通信方式 全双工(TX/RX独立) 全双工 半双工(共用一对线)
抗干扰 一般 强(差分信号)
典型应用 MCU内部通信 老式PC串口、调试口 工业现场、远距离通信

简单来说:UART是“内容”,RS232/RS485是“载体”。你写好了信(UART数据帧),需要邮递员送出去。RS232是骑自行车送,RS485是开卡车送。两者都能送信,但距离、速度、抗干扰能力完全不同。

我曾经在一个项目中,直接用UART的TTL电平接了3米长的线,结果数据全是乱码。后来加了MAX232芯片转成RS232电平,问题就解决了。为什么?因为TTL电平只有0~5V,线一长信号就衰减了。RS232用±12V,抗干扰能力强得多。

避坑指南:千万不要把UART的TX/RX直接接到RS232的DB9接口上!我曾经见过有人这么干,结果烧了单片机IO口。UART输出的是TTL电平,RS232需要电平转换芯片(如MAX232)来转换。

至于RS485,它用的是差分信号,两根线(A和B)的电压差来表示0和1。这种设计天生抗共模干扰,适合工业环境。但RS485是半双工的,同一时刻只能发或收,不能同时进行。这一点和UART/RS232的全双工不一样。

1.4 UART的应用场景——无处不在的串口

UART的应用场景,说实话,太多了。我随便列几个:

  • 调试输出:这是最常用的。MCU跑得对不对,打印个“Hello World”看看。我习惯在代码里留一个UART调试口,哪怕量产版也会保留,万一现场出问题,接上串口就能看日志。
  • GPS模块通信:GPS模块通常通过UART输出NMEA协议数据。你只要用UART接收,解析$GPGGA等语句,就能拿到经纬度。
  • 蓝牙/WiFi模块:像HC-05、ESP8266这些模块,都是通过UART和MCU通信的。你发AT指令,它回响应,简单粗暴。
  • 工业传感器:很多工业传感器(如温湿度、压力、流量计)都支持Modbus RTU协议,而Modbus RTU的物理层就是RS485,底层还是UART。
  • 单片机之间的通信:两个MCU要交换数据,最简单的方式就是UART直连。TX接RX,RX接TX,共地,搞定。

个人经验:如果你在做原型验证,手头没有逻辑分析仪,可以用UART的TX脚接一个LED,通过闪烁频率来粗略判断程序是否跑到了某个位置。虽然土,但管用。

你可能会问:现在有SPI、I2C这些高速总线,为什么还要用UART?原因很简单:UART不需要时钟线。SPI和I2C都需要额外的时钟线,而UART只要两根线(TX和RX)就能通信。在很多场景下,少一根线就意味着成本降低、可靠性提高。

而且,UART的协议简单到令人发指。你不需要像I2C那样处理从机地址、读写位、ACK/NACK。UART就是发数据、收数据,最多加个校验位。这种简单,在工业现场就是优势——出问题了容易排查。

好了,这一章就到这里。下一章我会讲UART的硬件设计,包括电平转换电路、波特率发生器、FIFO的使用技巧。到时候我会分享一个我踩过的坑——波特率误差导致通信失败,差点让我怀疑人生。