干货!UART通信的核心原理
扫描二维码
随时随地手机看文章
一、UART通信:从传统设备到现代嵌入式的常青树
还记得早年办公室里嗡嗡作响的针式打印机、拖着长线的机械鼠标,还有需要拨号上网的调制解调器吗?这些带着时代印记的设备,背后都依赖着同一种通信技术——UART。如今,USB接口凭借便捷性几乎取代了传统的串口连接器,但UART并没有退出历史舞台。在嵌入式开发领域,它依然是连接GPS模块、蓝牙模块、RFID读卡器与树莓派、Arduino等微控制器的核心纽带,是工程师调试设备、传输数据的“老朋友”。
UART,全称通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),本质上是一种负责串行与并行数据转换的硬件电路或独立芯片。它不像SPI、I2C那样是完整的通信协议,更像是设备间数据传输的“翻译官”:将CPU等控制设备输出的并行数据拆解成串行信号发送,同时把接收到的串行信号重新组装成并行数据,供接收设备处理。这种“翻译”能力,让UART成为了嵌入式系统中最基础也最可靠的通信方式之一。
二、UART通信的核心原理:异步传输的奥秘
UART最显著的特点是“异步通信”,这意味着它不需要专门的时钟信号来同步发送和接收设备的节奏。那么,没有时钟的“指挥”,两个设备如何保证数据传输的准确性?答案就藏在波特率与数据包结构的默契配合里。
(一)波特率:数据传输的“节拍器”
波特率是UART通信的“节拍器”,指的是每秒传输的比特数(bps),常见的波特率有9600、19200、115200等。发送和接收设备必须设置相同或误差在10%以内的波特率,否则就会出现“节奏错乱”,导致数据解析错误。比如,若发送端以115200bps的速度发送数据,而接收端误设为9600bps,那么接收设备会把原本1秒内的115200位数据当成9600位来读取,最终得到的只能是一堆乱码。
(二)数据包:承载数据的“标准化信封”
为了让接收设备准确识别数据的起始与结束,UART会给原始数据“套上”一个标准化的“信封”——数据包。一个完整的UART数据包由四部分组成:起始位、数据位、奇偶校验位和停止位。
起始位:数据传输的“发令枪”当没有数据传输时,UART的数据线通常保持高电平状态。一旦要开始发送数据,发送端会将数据线从高电平拉低并保持1个时钟周期,这个从高到低的跳变就是起始位。接收设备时刻监测着数据线的电平变化,一旦检测到这个跳变,就知道“数据要来了”,开始准备接收后续的比特流。
数据位:传输的“核心内容”数据位是数据包的核心,承载着实际要传输的信息。它的长度可以根据需求配置:如果使用奇偶校验位,数据位长度为5到8位;若不使用奇偶校验位,最长可设置为9位。在大多数情况下,数据会以“最低有效位优先”的顺序发送,也就是先传输二进制数的最右边一位。比如要发送十进制数“5”(二进制为0101),实际发送的顺序会是1、0、1、0。
奇偶校验位:数据的“安全检查员”在复杂的电磁环境或长距离传输中,数据位可能会受到干扰而发生翻转。奇偶校验位就是为了检测这种错误而设计的“安全检查员”。它分为奇校验、偶校验和无校验三种模式:
奇校验:数据位中1的个数加上奇偶校验位后,总数为奇数;
偶校验:数据位中1的个数加上奇偶校验位后,总数为偶数;
无校验:不添加奇偶校验位,适用于传输环境稳定、对错误容忍度较高的场景。 接收设备会统计数据位中1的个数,再与奇偶校验位对比,如果不符合预设的奇偶规则,就判定数据传输出现了错误。
停止位:数据传输的“结束语”当数据位和奇偶校验位发送完成后,发送端会将数据线从低电平重新拉高,并保持1到2个时钟周期,这就是停止位。它的作用是告诉接收设备“这个数据包结束了”,让接收设备做好接收下一个数据包的准备。停止位的长度可以设置为1位或2位,设置为2位时,抗干扰能力更强,但传输效率会略有降低。
三、UART通信的完整流程:从并行到串行的“旅程”
UART的数据传输过程,就像一场严谨的“接力赛”,每一个环节都紧密衔接,确保数据准确无误地从发送端抵达接收端。
(一)发送端:并行数据的“串行化打包”
第一步,发送UART从数据总线接收来自CPU或微控制器的并行数据。这些数据以字节为单位,同时出现在数据总线上。 第二步,发送UART为并行数据“打包”:在数据前面添加起始位,后面根据配置添加奇偶校验位和停止位,组成一个完整的数据包。 第三步,发送UART将数据包通过Tx引脚逐位串行发送出去。此时,原本并行的字节数据,被拆解成了一串按时间顺序排列的比特流,在数据线上以高低电平的形式传输。
(二)接收端:串行信号的“并行化还原”
第一步,接收UART通过Rx引脚持续监测数据线的电平变化。当检测到起始位的高到低跳变时,便开始以波特率对应的频率采样后续的比特流。 第二步,接收UART将接收到的串行比特流重新组装成数据包,并丢弃起始位、奇偶校验位和停止位,提取出核心的 data 位。 第三步,接收UART将还原后的并行数据传输到接收端的数据总线,供CPU或微控制器读取和处理。
四、UART通信的硬件连接:简单却严谨的“规则”
UART的硬件连接看似简单,只需要发送线(Tx)、接收线(Rx)和地线(GND)三根线,但连接时必须遵循“交叉连接”的规则:发送设备的Tx引脚要连接到接收设备的Rx引脚,接收设备的Tx引脚连接到发送设备的Rx引脚,同时两个设备的GND必须相连,以保证电平参考一致。
需要特别注意的是,不同设备的UART电平标准可能不同。比如,传统PC的RS232接口使用的是±12V的电平,而微控制器的UART通常使用3.3V或5V的TTL电平。如果直接连接不同电平标准的设备,很可能会损坏芯片。这时候就需要添加电平转换电路,比如MAX232芯片,实现RS232与TTL电平之间的转换,确保通信安全。
五、UART通信的优缺点:适合的才是最好的
(一)优点:简洁实用的“老伙计”
硬件需求简单:仅需三根线即可实现全双工通信,大大降低了硬件设计的复杂度和成本,尤其适合资源有限的嵌入式系统。
无需时钟信号:异步传输模式让设备摆脱了时钟线的束缚,布线更加灵活,也减少了因时钟干扰导致的通信错误。
错误检测机制:奇偶校验位的存在,为数据传输提供了基础的错误检测能力,提升了通信的可靠性。
配置灵活:数据包的结构(数据位长度、奇偶校验模式、停止位长度)可以根据实际需求灵活配置,适配不同的应用场景。
兼容性强:UART是一种经过长期验证的成熟技术,几乎所有的微控制器和嵌入式设备都支持UART接口,文档资料丰富,开发门槛低。
(二)缺点:并非全能的“通信专家”
数据帧长度有限:数据位最多只能设置为9位,这意味着单个数据包最多只能承载9位数据,对于需要传输大量连续数据的场景,效率较低。
不支持多设备组网:UART是点对点的通信方式,一个发送端只能对应一个接收端,无法像I2C或SPI那样实现多设备组网,扩展性较差。
波特率同步要求高:发送和接收设备的波特率必须严格匹配(误差不超过10%),否则会导致通信失败,在一些对时钟精度要求不高的设备上,可能需要额外的校准机制。
六、UART通信的应用场景:从调试到工业控制
UART的特性决定了它在很多场景中都能发挥独特的作用:
(一)设备调试:工程师的“得力助手”
在嵌入式开发过程中,UART是最常用的调试工具之一。工程师可以通过UART将微控制器内部的寄存器值、程序运行状态等信息打印到串口调试助手,实时监测程序的运行情况,快速定位bug。比如在调试STM32单片机时,通过配置UART串口,就能轻松输出调试信息,大大提高开发效率。
(二)短距离数据传输:传感器与控制器的“桥梁”
在物联网和工业控制领域,UART常被用于连接传感器与控制器。比如,温湿度传感器、光照传感器等可以通过UART将采集到的数据发送给微控制器,微控制器再根据这些数据执行相应的控制逻辑。这种短距离、低速率的传输场景,UART的简洁性和可靠性刚好能满足需求。
(三)模块扩展:功能拓展的“接口”
很多功能模块,比如GPS模块、蓝牙模块、RFID读卡器等,都提供了UART接口。通过UART,这些模块可以快速与树莓派、Arduino等主控设备连接,实现定位、无线通信、身份识别等功能。比如在一个智能小车项目中,通过UART连接蓝牙模块,就能用手机远程控制小车的运动。





