目录
概述
1 基本编码规则
1.1 帧结构
1.2 关键参数
1.3 串口通信要点
2 典型波形示例
3 时序特性
3.1 位时间计算
3.2 完整帧时间
4 使用IO模拟UART
5 实际波形案例分析
6 UART通信参数配置
6.1 关键参数详解
6.2 常用波特率表
7 UART编程模型
7.1 轮询方式
7.2 中断方式
7.3 DMA方式
8 UART变种与相关协议
概述
UART通信是一种异步串行通信协议,其中TX(发送线)和RX(接收线)分别用于发送和接收数据。本文主要介绍编码规则和波形。
1 基本编码规则
1.1 帧结构
USART
字符帧(
8
数据位和
1
停止位)

-
空闲状态:线路保持高电平(逻辑1)
-
起始位:1位低电平(逻辑0),标志数据帧开始
-
数据位:5-9位,通常为8位,LSB(最低位)先发送
-
校验位:奇校验、偶校验或无校验
-
停止位:1、1.5或2位高电平(逻辑1)
1.2 关键参数
-
波特率:常见的有9600、115200等
-
数据位:5、6、7、8、9位(常用8位)
-
停止位:1、1.5、2位
-
校验位:无、奇、偶校验
1.3 串口通信要点
异步通信:无时钟线,依靠双方约定的波特率
起始位同步:每个数据帧重新同步
LSB优先:数据位从最低位开始传输
空闲高电平:线路空闲时保持逻辑1
帧间隔:停止位后可立即发送下一帧或保持空闲
2 典型波形示例
示例1:发送字符'A' (0x41 = 0100 0001b)
-
配置:8位数据,无校验,1停止位,波特率9600
-
发送顺序(LSB先发):1 0 0 0 0 0 1 0

示例2:带奇校验的波形
发送字符'B' (0x42 = 0100 0010b),1的个数为2(偶数)
-
奇校验:校验位应为1(使总1的个数为奇数)
-
发送顺序:0 1 0 0 0 0 1 0 1

3 时序特性
3.1 位时间计算

3.2 完整帧时间

4 使用IO模拟UART

代码示例如下:
// 简化版UART发送模拟
void uart_send_byte(uint8_t data) {
// 发送起始位(低电平)
TX_PIN = 0;
delay_bit_time();
// 发送8个数据位(LSB先发)
for(int i = 0; i < 8; i++) {
TX_PIN = (data >> i) & 0x01;
delay_bit_time();
}
// 发送停止位(高电平)
TX_PIN = 1;
delay_bit_time();
}
5 实际波形案例分析
1) 9600波特率传输"Hello"

2) 115200波特率带奇校验

6 UART通信参数配置
6.1 关键参数详解
// 典型UART配置结构
typedef struct {
uint32_t baud_rate; // 波特率:9600, 19200, 38400, 57600, 115200等
uint8_t data_bits; // 数据位:5, 6, 7, 8, 9
uint8_t stop_bits; // 停止位:1, 1.5, 2
char parity; // 校验:N(无), O(奇), E(偶)
bool flow_control; // 流控:RTS/CTS
} uart_config_t;
6.2 常用波特率表
|
波特率 |
位时间 |
字符/秒(8N1) |
应用场景 |
|
300 |
3.33ms |
30 |
老式调制解调器 |
|
1200 |
833μs |
120 |
早期终端 |
|
2400 |
417μs |
240 |
简单传感器 |
|
9600 |
104μs |
960 |
最常用,稳定可靠 |
|
19200 |
52μs |
1920 |
中速通信 |
|
38400 |
26μs |
3840 |
蓝牙SPP |
|
57600 |
17.4μs |
5760 |
GPS模块 |
|
115200 |
8.68μs |
11520 |
高速调试端口 |
|
230400 |
4.34μs |
23040 |
高速数据采集 |
|
460800 |
2.17μs |
46080 |
视频传输 |
|
921600 |
1.09μs |
92160 |
极限速率 |
7 UART编程模型
7.1 轮询方式
// 简单但效率低,适用于低速通信
void uart_send_polling(uint8_t data) {
while(!(UART->SR & UART_SR_TXE)); // 等待发送缓冲区空
UART->DR = data;
}
uint8_t uart_receive_polling(void) {
while(!(UART->SR & UART_SR_RXNE)); // 等待接收数据
return UART->DR;
}
7.2 中断方式
// 提高效率,避免CPU空等
volatile uint8_t rx_buffer[256];
volatile uint8_t rx_index = 0;
void USART1_IRQHandler(void) {
if(USART1->SR & USART_SR_RXNE) {
// 接收数据
uint8_t data = USART1->DR;
rx_buffer[rx_index++] = data;
// 处理数据(如放入环形缓冲区)
}
if(USART1->SR & USART_SR_TXE) {
// 发送缓冲区空,可发送下一字节
if(tx_buffer_not_empty()) {
USART1->DR = get_next_tx_byte();
} else {
USART1->CR1 &= ~USART_CR1_TXEIE; // 禁用发送中断
}
}
}
7.3 DMA方式
// 最高效率,适合大数据量传输
void uart_dma_send(uint8_t *data, uint32_t len)
{
// 配置DMA源地址(内存)
DMA1_Channel4->CMAR = (uint32_t)data;
// 配置DMA目标地址(UART数据寄存器)
DMA1_Channel4->CPAR = (uint32_t)&USART1->DR;
// 设置传输长度
DMA1_Channel4->CNDTR = len;
// 启动DMA传输
DMA1_Channel4->CCR |= DMA_CCR_EN;
// 使能UART的DMA发送
USART1->CR3 |= USART_CR3_DMAT;
}
8 UART变种与相关协议
1) USART(Universal Synchronous/Asynchronous Receiver/Transmitter)
-
支持同步和异步模式
-
同步模式下有时钟线(如SPI)
-
常见于STM32等高级MCU
2) LIN(Local Interconnect Network)
-
基于UART的汽车网络协议
-
单线通信,成本低
-
主从结构,用于车身控制
3) IrDA(红外数据通信)
-
使用UART协议,红外介质
-
需要编解码芯片
-
短距离无线通信
4) Modbus RTU
-
基于串口的工业协议
-
使用UART作为物理层
-
主从问答式通信


