核心讲解内容:
1、异步串行
2、数据帧
3、收发模式
UART串口通信是嵌入式开发的核心基本功,它是入门必须掌握的基础通信协议,同时也是嵌入式开发必学技能,具体知识点和原因如下:
1.基础概念与核心特性
UART全称通用异步收发传输器,属于异步串行全双工通信。
TTL:采用单端电压表示逻辑状态,由于电压摆幅小且采用单端对地参考,极易受共模噪声影响,传输距离极短仅限于1米以内(甚至小于30厘米)。支持全双工通信,通常采用点对点(1对1)连接,需要TX(发送)、RX(接收)和GND(地线)三根线。
RS232:采用负逻辑的单端传输方式,较高的电压摆幅提升了抗干扰能力,标准最大有效传输距离可达15米。由于电平与TTL不兼容,必须使用电平转换芯片(如MAX232)才能与微控制器连接。支持全双工通信,仅支持点对点(1对1)通信,无法直接实现多设备组网。
RS485:采用差分信号(平衡传输)方式,使用A、B两根线,通过两线间的电压差来表示逻辑状态。支持半双工(两线制)和全双工(四线制)通信。它允许多个发送器连接到同一条总线上,支持真正的多点双向通信,标准负载下最多可挂接32个节点。
1.1.串行 vs 并行:
串行是按位逐个传输,只需要少量线路;
并行是同时传输多位,但占用大量IO口,仅适合短距离高速场景。
UART只需要TX(发送)、RX(接收)两根线就能实现双向数据传输,相比并行通信占用引脚极少、成本低、抗干扰能力强,适合设备间中短距离通信。

1.2.异步 vs 同步:
异步通信,数据传输无需共用时钟线,双方通过提前约定的波特率来实现数据帧传输速度同步,通过数据帧的起始位开始和停止位确定传输结束。
同步通信,通信双方共用一根时钟线来精准协调数据传输节奏,能实现更高速、稳定的数据交互。

TX负责发送数据(输出),RX负责接收数据(输入),接线时必须交叉连接(模块TX接主控RX,模块RX接主控TX)。
不需要共用时钟线,双方靠提前约定的波特率实现速度同步,这是UART最核心的设计特点。
1.3.全双工vs半双工
全双工:支持数据在两个方向上同时传输,通信双方可同时发送和接收数据。

半双工:数据可双向传输,但同一时刻只能单向进行,通信双方需交替收发。


通信双方必须完全匹配参数,否则会出现乱码、丢包:


标准UART数据帧结构为:起始位(1位) → 数据位 → 校验位(可选) → 停止位,起始位用逻辑0通知接收方数据开始传输。
如果再发其他数据,再依次循环这个过程即可。
比如115200波特率、8数据位、无校验、1停止位的数据帧结构中:
以1个字符(8数据位)为传输单位,是通过起始位1位设置逻辑“0”表示开始发送,停止位1 位设置逻辑“1”表示结束发送来确定。传输2个字符之间的时间间隔,比如传输0X33后再传输0X35,这两者时间间隔是未知的。
但是,同一字符内相邻位间的时间间隔是确定的,比如0X33低两位的1和1之间的时间间隔是确定的,这是UART传输速率的概念——波特率。(uart控制器配置了时钟源后,通过一些列相关的寄存器配置,分频后,产生指定的波特率。)

一帧完整数据(10位:1起始+8数据+1停止)。
时间基准:波特率定义了每个“位”(bit)在物理线路上持续的时间。
同步基础:由于UART是异步通信,没有共享时钟线,接收方必须依靠起始位的下降沿来启动内部计时器,并按照约定的波特率在每个位的中间时刻进行采样,以正确读取数据。
波特率的产生是通过硬件分频器将系统主时钟(如晶振或PLL输出)降频至目标速率的过程(波特率发生器是一个可编程的分频器)。在UART通信中,它并非由软件“生成”,而是由芯片内部的波特率发生器根据预设寄存器值自动计算并输出的信号。所以开发者只需配置寄存器指定时钟、分频系数等信息,芯片内部会自动计算,将精力主要放在UART控制器应用后的其他功能实现上就可以。

2.收发模式
2.1.查询式收发
特点:CPU 主动轮询状态标志位(如TX Empty、RX Ready)
发送:不断检查发送缓冲是否为空,空了就塞下一个字节
接收:不断检查是否收到数据,有就读走
阻塞式:轮询期间CPU无法做其他事情
优点:实现简单、无中断开销,适合低流量场景
缺点:会阻塞主程序运行,浪费CPU资源、实时性差、不适合多任务

2.2.中断式收发
特点:硬件触发中断,CPU 被动响应
接收:数据到达时自动中断,CPU读出并存储
发送:发送缓冲空时触发中断,CPU自动填充下一个字节
非阻塞:主程序正常执行,只有收发发生时短暂打断
优点:不影响主程序运行,CPU利用率高、响应及时、支持多任务。
缺点:需要中断管理(优先级、重入保护)、代码稍复杂

2.3.典型代码示例(概念性)
查询式发送:
//主程序执行到这里,顺序执行程序
void uart_send_query(char data) {
/*轮询发送寄存器是否为空*/
while (!(UART_SR & TX_EMPTY)); // 等待上次发送完成
UART_DR = data; // 发送新数据
}
中断式接收:
//中断触发执行处理程序,主程序可以干别的事,数据到了自动处理
void UART_IRQHandler(void) {
if (UART_SR & RX_READY) {
char data = UART_DR; // 读取数据
rx_buffer[rx_index++] = data; // 存入缓存
}
}
2.4.如何选择?

为什么串口是嵌入式开发必学技能?
最通用的基础通信方式,应用无处不在:小到单片机程序调试打印、单片机与电脑交互,大到蓝牙/WiFi/GPS/4G等外设模块的指令交互、工业设备参数配置、多机数据传输,都依赖UART串口通信,是嵌入式开发中使用最广泛的基础协议。
开发调试必不可少的核心工具:嵌入式开发中,串口是最常用的程序调试手段——开发者可以通过串口打印程序运行状态、变量数值,快速定位BUG,相当于开发过程中的"千里眼",没有串口调试会极大提升开发难度。
学习其他通信协议的基础:UART是串行通信中最简单、最基础的协议,理解UART的异步串行原理后,再学习IIC、SPI、CAN等其他串行总线会更容易理解,是嵌入式通信知识体系的入门基石。
硬件简单软件门槛低:仅需两根线即可实现通信,硬件连接简单,软件配置逻辑清晰,非常适合入门者理解设备间通信的基本原理,建立"跨设备数据交互"的核心概念,是嵌入式入门的必经之路。
进阶学习UART : 1.TTL RS232 RS485 ; 2.原理图 -> 数据手册 ;3.实验 查询形式、中断形式uart;
迭代学习:其他外设,通过uart辅助调试等操作。