UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是一种广泛应用于嵌入式系统中的串行通信协议,用于设备间的数据传输。
1. UART的基本原理
-
UART是一种异步通信协议,无需额外的时钟信号,通过约定的波特率实现通信。
-
数据通过串行方式逐位传输,起始位和停止位用于标志数据的开始和结束。
-
常见的帧格式包括:起始位(1位) + 数据位(5-8位) + 可选校验位 + 停止位(1或2位)。
-
发送数据时,先发送低位再发送高位,例如发送0x55(01010101)时,数据格式为:空闲位 + 起始位 + 1 0 1 0 1 0 1 0(数据位) + 校验位 + 停止位 + 空闲位。
2. UART通信的关键参数
-
波特率(Baud Rate):表示每秒传输的位数(bps),常见波特率有9600、115200等,通信双方需要设置相同的波特率。
-
数据位(Data Bits):一帧数据中有效数据的长度,通常是8位。
-
校验位(Parity Bit):用于检测传输过程中是否有错误,可选奇校验、偶校验或无校验。例如:
-
奇校验:发送数据中奇数个1时,校验位为0;偶数个1时,校验位为1。
-
偶校验:发送数据中偶数个1时,校验位为0;奇数个1时,校验位为1。
-
-
停止位(Stop Bit):标志数据帧的结束,可以是1位或2位。
3. UART的工作流程
-
发送端将数据写入发送寄存器(TX Buffer)。
-
数据经过串行化后通过TX引脚输出。
-
接收端通过RX引脚接收数据并存入接收寄存器(RX Buffer)。
-
接收端将数据重新组帧并交给上层处理。
-
接收方通过波特率及时间判定传输的数据内容和时序。
4. UART的硬件组成
-
发送模块:负责数据的串行化,添加起始位和停止位。
-
接收模块:负责接收串行数据,校验并重新组帧。
-
波特率发生器:生成与设定波特率相符的时钟信号。
-
FIFO寄存器:缓冲多字节数据,避免数据丢失。
5. UART的连接方式
-
UART通信使用两条数据线实现全双工通信(TX和RX),总线需交叉接线,即发送端的TX连接到接收端的RX。
-
半双工通信只需一条数据线,但无法同时进行发送和接收。
-
设置引脚功能的本质是将引脚在芯片内部连接到相应的UART控制器。
6. UART的优缺点
优点:
-
硬件简单,成本低。
-
通信距离较长,可达几十米。
-
使用方便,无需时钟同步。
缺点:
-
通信速率有限,通常不超过1Mbps。
-
不支持多设备总线通信。
-
容易受噪声干扰,需要良好的信号调节。
7. UART寄存器与配置
UART控制器通过一系列寄存器实现数据传输、配置和状态管理。常见寄存器包括:
-
数据寄存器(DR/THR/RHR):
-
用于存储要发送或接收的数据。
-
写入数据寄存器表示发送,读取数据寄存器表示接收。
-
-
波特率寄存器(Baud Rate Register):
-
用于设置通信波特率。
-
通常需要分频器和系统时钟的配合来实现精确的波特率。
-
-
控制寄存器(Control Register):
-
包含启用UART模块、设置数据位长度、校验位、停止位等配置项。
-
-
状态寄存器(Status Register):
-
用于指示UART当前状态,例如发送缓冲区是否满、接收缓冲区是否有数据等。
-
-
中断寄存器(Interrupt Register):
-
配置和管理UART的中断功能,例如接收数据完成中断、发送完成中断等。
-
8. UART编程实现
以下是一个简单的UART初始化和数据收发流程示例(以STM32为例):
#include "stm32f4xx.h"
void UART_Init(void) {
// 1. 配置波特率
USART1->BRR = 0x683; // 假设波特率为9600,时钟频率为16MHz
// 2. 启用发送和接收功能
USART1->CR1 |= USART_CR1_TE | USART_CR1_RE;
// 3. 启用UART外设
USART1->CR1 |= USART_CR1_UE;
}
void UART_SendChar(char c) {
while (!(USART1->SR & USART_SR_TXE)); // 等待发送缓冲区为空
USART1->DR = c;
}
char UART_ReceiveChar(void) {
while (!(USART1->SR & USART_SR_RXNE)); // 等待接收缓冲区有数据
return USART1->DR;
}
int main(void) {
UART_Init();
// 发送数据
UART_SendChar('H');
UART_SendChar('i');
// 接收数据并回显
char received = UART_ReceiveChar();
UART_SendChar(received);
while (1);
}
9. UART与其他通信协议的比较
协议 | 类型 | 传输速度 | 是否同步 | 支持设备数量 |
---|---|---|---|---|
UART | 串行异步 | 较低(1Mbps以内) | 否 | 1对1 |
SPI | 串行同步 | 较高(几十Mbps) | 是 | 1对多 |
I2C | 串行同步 | 中等(几Mbps) | 是 | 多主多从 |
10. UART调试中的常见问题及解决方法
-
波特率不匹配:确认发送端和接收端波特率一致。
-
数据丢失:检查FIFO寄存器的溢出标志,确保软件及时读取数据。
-
噪声干扰:缩短连线长度,增加屏蔽层,或降低波特率。
-
校验失败:确认校验方式一致。
11. UART在实际项目中的应用
UART常用于以下场景:
-
微控制器与传感器之间的数据通信。
-
调试接口(如串口调试工具)。
-
GPS模块、蓝牙模块、Wi-Fi模块的通信。
-
工业设备的控制和监控。