2. 串口通信基础:UART/USART协议原理、数据帧格式、波特率、起始位/停止位/校验位

串口(UART/USART)是嵌入式系统中最基础、最常用的通信接口之一。在STM32开发中,理解串口通信的底层原理是掌握DMA+空闲中断接收不定长数据的前提。本章将系统讲解UART/USART协议的核心概念,包括数据帧结构、波特率计算、同步/异步差异以及校验机制。

2.1 UART与USART:概念辨析

UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)和USART(Universal Synchronous/Asynchronous Receiver/Transmitter,通用同步/异步收发器)是两种常见的串行通信模块。两者的核心区别在于是否支持同步模式。

特性 UART USART
通信模式 仅异步 同步 + 异步
时钟信号 无独立时钟线,双方约定波特率 同步模式下提供SCLK时钟线
硬件引脚 TX、RX(2线) TX、RX、SCLK(3线,同步模式)
典型应用 GPS模块、蓝牙模块、调试串口 SPI设备扩展、智能卡接口
STM32支持 部分低功耗型号 主流STM32系列(如F1/F4/H7)
开发提示:在STM32课程中,我们通常使用USART配置为异步模式(即当作UART使用)。USART的同步模式在需要额外时钟输出的场景(如驱动移位寄存器)才会启用,日常串口通信无需关注SCLK引脚。

2.2 数据帧格式:从起始位到停止位

串口通信以“帧”为单位传输数据。一个标准的数据帧由以下部分组成:

  • 起始位(Start Bit):1位,逻辑低电平(0),标志数据帧开始。
  • 数据位(Data Bits):通常为8位或9位,低位在前(LSB first)。
  • 校验位(Parity Bit):可选,用于简单检错。
  • 停止位(Stop Bit):1位、1.5位或2位,逻辑高电平(1),标志数据帧结束。
关键概念:空闲状态时TX/RX线保持高电平。起始位的下降沿(高→低)是接收器同步时钟的触发信号,这是异步通信能够工作的基础。
UART数据帧结构(8位数据 + 无校验 + 1位停止位) 空闲 高电平 起始位 低电平 D0 LSB D1 D2 D3 D4 D5 D6 D7 停止位 高电平 空闲 高电平 说明: • 起始位(低电平)唤醒接收器,停止位(高电平)保证帧间间隔 • 数据位传输顺序:LSB(最低有效位)先发,MSB最后发

2.3 波特率:通信的“心跳”

波特率(Baud Rate)定义每秒传输的符号数,单位是bps(bits per second)。在UART通信中,一个符号对应一个比特位,因此波特率等于比特率。

常用波特率标准:

波特率(bps) 每位时间(μs) 典型应用场景
9600 104.17 GPS模块、工业传感器、调试终端
19200 52.08 蓝牙模块、低速数据采集
38400 26.04 通用串口设备
115200 8.68 STM32调试串口、WiFi模块
921600 1.09 高速数据传输、固件升级
常见误区:波特率越高,传输速度越快,但误码率也会上升。在长距离通信(如RS-232超过10米)或电磁干扰较强的环境中,建议使用9600或19200 bps以保证数据可靠性。STM32内部通过时钟分频产生波特率,需确保系统时钟频率能精确分频出目标波特率,否则会产生累积误差。

2.4 校验位:简单的错误检测

校验位用于检测传输过程中是否发生单比特翻转错误。UART支持三种校验模式:

  • 无校验(None):不发送校验位,数据帧最短,效率最高。
  • 奇校验(Odd):数据位 + 校验位中“1”的总数为奇数。
  • 偶校验(Even):数据位 + 校验位中“1”的总数为偶数。

校验位计算示例(8位数据):

数据(二进制) 数据中“1”的个数 偶校验位 奇校验位
0b01010101 4(偶数) 0 1
0b01010111 5(奇数) 1 0
0b00000000 0(偶数) 0 1
0b11111111 8(偶数) 0 1
开发建议:在STM32串口配置中,校验位会占用数据帧中的第9位(如果配置为8位数据+校验,则实际有效数据为7位)。对于不定长数据接收,推荐使用“8位数据 + 无校验 + 1位停止位”的经典配置,这样每帧传输1字节,数据处理最直观。

2.5 异步通信的时序与采样

异步通信没有独立的时钟线,接收端通过以下方式恢复数据:

  1. 检测起始位:检测到RX线从高电平跳变到低电平,启动内部采样时钟。
  2. 位采样:在每个位周期的中间时刻(如第8个采样点)读取电平值,避免信号跳变沿的干扰。
  3. 帧结束:检测到停止位(高电平)后,等待下一帧起始位。
异步通信采样时序(16倍过采样) 起始位 D0 D1 D2 D3 D4 D5 D6 D7 采样策略: • 接收器以16倍波特率时钟过采样,在每个位周期的第8、9、10个采样点取多数表决值 • 红色圆点标记位周期中间采样点,避开信号跳变沿,提高抗干扰能力

2.6 STM32串口配置关键参数

在STM32 HAL库中,串口初始化通过 UART_HandleTypeDef 结构体配置。以下是核心参数及其对应关系:

// STM32串口初始化结构体示例
UART_HandleTypeDef huart1;

huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;           // 波特率
huart1.Init.WordLength = UART_WORDLENGTH_8B;  // 数据位:8位
huart1.Init.StopBits = UART_STOPBITS_1;       // 停止位:1位
huart1.Init.Parity = UART_PARITY_NONE;        // 校验位:无
huart1.Init.Mode = UART_MODE_TX_RX;           // 收发模式
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;  // 硬件流控:无
huart1.Init.OverSampling = UART_OVERSAMPLING_16; // 过采样:16倍
HAL_UART_Init(&huart1);
参数选择建议:对于本课程的不定长数据接收场景,推荐使用 115200-8-N-1 配置(波特率115200、8位数据、无校验、1位停止位)。该配置在速度和可靠性之间取得平衡,且与大多数串口调试工具兼容。

2.7 硬件流控:RTS/CTS

硬件流控通过额外的RTS(请求发送)和CTS(清除发送)信号线实现收发双方的流量控制,防止接收缓冲区溢出。

信号线 方向 功能说明
RTS 输出 接收端通知发送端“我可以接收数据”
CTS 输入 发送端检测接收端是否准备好
课程关联:在DMA+空闲中断接收方案中,通常不使用硬件流控。DMA控制器自动将数据从USART DR寄存器搬运到内存缓冲区,CPU无需逐字节干预,因此接收缓冲区溢出的风险远低于中断方式。但如果数据量极大(如持续高速流),仍建议评估是否启用流控。

2.8 本章小结

串口通信的基础知识是后续实现DMA+空闲中断接收的基石。重点掌握:

  • UART与USART的差异:USART支持同步模式,日常使用配置为异步模式。
  • 数据帧结构:起始位(低电平)→ 数据位(LSB first)→ 校验位(可选)→ 停止位(高电平)。
  • 波特率决定通信速度,需确保收发双方一致且误差在允许范围内(通常<2%)。
  • 校验位提供单比特检错能力,但会减少有效数据位宽。
  • STM32 HAL库通过结构体参数灵活配置串口,推荐115200-8-N-1作为通用配置。