UART协议:完整教程

best365中国官网 admin 2025-07-23 03:06:20

UART(Universal Asynchronous Receiver-Transmitter,通用非同步收发器)是嵌入式系统中最常用的串行通信协议之一。它通过TX(传输)和RX(接收)两根线实现全双工通信,广泛应用于设备之间的数据传输。本文将详细介绍UART协议的基本原理、硬件连接、软件实现以及实际应用,帮助读者全面掌握UART的使用方法。

一、UART协议的功能与特点

功能

UART用于实现嵌入式系统中的串行通信。

支持全双工通信,即可以同时发送和接收数据。

通常用于短距离通信,如设备与设备之间的数据传输。特点

全双工通信:可以同时发送和接收数据。

异步通信:没有固定的时钟信号,通过波特率协调数据传输。

高灵活性:支持多种波特率和数据格式。

硬件实现简单:只需两根线(TX和RX)即可实现通信。

二、UART协议的工作原理总线结构

UART协议使用两根主要线:

TX(传输线):用于发送数据。

RX(接收线):用于接收数据。

此外,UART还支持流控制信号:

CTS(Clear to Send):表示可以发送数据。

RTS(Request to Send):请求发送数据。

2. 通信模式

UART支持以下几种通信模式:

单工通信:只能单向传输数据。

半双工通信:可以双向传输数据,但不能同时发送和接收。

全双工通信:可以同时发送和接收数据。

3. 数据传输格式

UART协议的数据帧格式如下:

起始位:表示数据传输的开始。

数据位:通常为8位,但也可以是7位或9位。

奇偶校验位:用于检测数据传输中的错误。

停止位:表示数据传输的结束,通常为1位或2位。

三、UART软件实现

初始化UART模块

在开始UART通信之前,需要对UART模块进行初始化,包括设置波特率、数据位、停止位和奇偶校验等参数。以下是初始化的主要步骤:

配置UART时钟。

设置波特率。

配置数据位、停止位和奇偶校验。

启用UART模块。

2. UART发送数据

以下是UART发送数据的流程:

检查UART的发送缓冲区是否为空。

将数据加载到发送缓冲区。

启动发送。

等待数据发送完成。

3. UART接收数据

以下是UART接收数据的流程:

检查UART的接收缓冲区是否有数据。

读取数据。

处理接收到的数据。

4. 中断处理

为了提高系统的效率,可以使用中断处理UART的发送和接收。以下是中断处理的主要步骤:

配置UART中断。

编写中断服务程序(ISR)。

在ISR中处理发送和接收的数据。

四、实际应用示例

以下以STM32单片机为例,演示如何通过UART协议与PC进行通信。

硬件连接

STM32的UART2_TX引脚连接到PC的串口的RX引脚。

STM32的UART2_RX引脚连接到PC的串口的TX引脚。

使用串口调试工具(如PuTTY)进行通信。软件实现

(1)UART初始化

#include "stm32f10x.h"

void UART_Init(void) {

// 配置GPIO为UART模式

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

USART_InitTypeDef USART_InitStructure;

USART_InitStructure.USART_BaudRate = 9600; // 设置波特率为9600

USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 8位数据

USART_InitStructure.USART_StopBits = USART_StopBits_1; // 1位停止位

USART_InitStructure.USART_Parity = USART_Parity_None; // 无奇偶校验

USART_InitStructure.USART_Mode = USART_Mode_TX | USART_Mode_RX; // 收发模式

USART_Init(USART2, &USART_InitStructure);

USART_Cmd(USART2, ENABLE); // 启用USART2

}

(2)UART发送数据

void UART_SendChar(uint8_t ch) {

while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);

USART_SendData(USART2, ch);

}

(3)UART接收数据

uint8_t UART_ReceiveChar(void) {

while (USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET);

return USART_ReceiveData(USART2);

}

(4)主程序

int main(void) {

UART_Init(); // 初始化UART

while(1) {

// 发送字符'A'

UART_SendChar('A');

// 延时1秒

Delay_Ms(1000);

}

}

PC端调试

打开PuTTY,选择“Serial”选项。

设置波特率为9600,数据位为8位,停止位为1位,奇偶校验为无。

点击“Open”打开串口。

会看到STM32发送的字符’A’。

五、常见问题总结

数据接收错误:检查波特率是否一致,确保发送端和接收端的波特率设置相同。

通信不稳定:检查串口连接是否正确,确保TX和RX线没有短路或断开。

数据丢包:增加接收缓冲区的大小,减少数据发送的频率,或者使用流控制信号。

中断处理问题:确保中断服务程序(ISR)正确处理发送和接收的数据,避免数据溢出。

六、结语

UART协议是嵌入式系统中一种高效、可靠的通信方式,广泛应用于设备之间的数据传输。本文通过详细的理论讲解和实际应用示例,帮助读者全面掌握UART协议的使用方法。无论是开发入门还是项目实战,这篇教程都能为您提供有价值的参考。希望您在嵌入式开发的道路上越走越远!