4、异步传输帧格式:起始位、数据位(5-8位)、奇偶校验位、停止位,以及帧格式的配置方法
UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)作为串行通信中最经典的物理层协议,其核心在于将并行数据转换为串行比特流,并通过约定的帧格式在收发双方之间传递信息。与I2C、SPI等同步通信不同,UART不依赖时钟线,而是依靠收发双方预先配置的波特率和帧格式来实现比特同步与字节对齐。本章将深入拆解异步传输帧的每一个组成单元,并给出工程实践中的配置方法与校验策略。
4.1 帧格式的核心原理:从空闲态到停止位的完整时序
UART 的异步特性决定了其帧结构必须包含同步标志和结束标志。当总线处于空闲状态时,TX 线保持高电平。发送端准备发送数据时,首先拉低电平一个位时间,这个下降沿就是接收端检测帧起始的同步信号,即起始位(Start Bit)。起始位固定为逻辑 0,且仅占 1 个位周期。接收端在检测到下降沿后,会以波特率的 16 倍或 8 倍过采样率对后续电平进行采样,以确保在数据位中心附近读取稳定电平。
起始位之后是数据位(Data Bits),其长度可在 5 至 8 位之间配置。数据位按照LSB First(最低有效位在前)的顺序逐位发送。例如发送字节 0x55(二进制 01010101),则线上电平依次为 1、0、1、0、1、0、1、0(LSB 为 1)。数据位长度决定了单帧能携带的有效信息量:5 位用于老式电传打字机,7 位常用于 ASCII 码(0-127),8 位是最通用的二进制数据传输格式。
数据位之后是奇偶校验位(Parity Bit),这是一个可选项。校验位用于检测传输过程中的单比特错误。若配置为偶校验(Even Parity),则校验位使得数据位和校验位中“1”的总数为偶数;若配置为奇校验(Odd Parity),则总数为奇数。若不需要校验,则此位被省略,帧格式变为 8N1(8 数据位、无校验、1 停止位)。
帧的最后是停止位(Stop Bit),固定为逻辑 1,长度可配置为 1、1.5 或 2 个位周期。停止位不仅标志一帧的结束,更重要的是为下一帧的起始位提供一个明确的电平跳变沿(从高到低)。如果停止位过短,接收端可能无法正确识别下一帧的起始位。停止位之后,线路回到空闲高电平状态,等待下一帧发送。
4.2 帧格式的配置方法与操作流程
在 STM32、NXP、TI 等主流 MCU 中,UART 帧格式的配置通常通过寄存器操作或 HAL 库函数完成。配置的核心参数包括:字长(Word Length)、校验位(Parity)、停止位(Stop Bits)。以下以 STM32 HAL 库为例,展示标准配置流程。
// 配置 UART 句柄
UART_HandleTypeDef huart2;
huart2.Instance = USART2;
huart2.Init.BaudRate = 115200; // 波特率
huart2.Init.WordLength = UART_WORDLENGTH_8B; // 8 位数据位
huart2.Init.StopBits = UART_STOPBITS_1; // 1 位停止位
huart2.Init.Parity = UART_PARITY_NONE; // 无校验
huart2.Init.Mode = UART_MODE_TX_RX; // 收发使能
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; // 无硬件流控
huart2.Init.OverSampling = UART_OVERSAMPLING_16; // 16 倍过采样
if (HAL_UART_Init(&huart2) != HAL_OK)
{
Error_Handler();
}
配置过程中需注意:当使能了奇偶校验位时,数据位长度必须包含校验位本身。例如,若需要传输 8 位数据并带偶校验,则寄存器中设置的 WordLength 应为 9 位(8 数据位 + 1 校验位)。在 STM32 中,这对应 UART_WORDLENGTH_9B。这一点极易被初学者忽略,导致收发数据错位。
对于 Linux 或嵌入式 Linux 系统,使用 termios 结构体配置串口参数:
struct termios options;
tcgetattr(fd, &options);
cfsetispeed(&options, B115200);
cfsetospeed(&options, B115200);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~PARENB; // 无校验
options.c_cflag &= ~CSTOPB; // 1 位停止位
options.c_cflag &= ~CSIZE; // 掩码
options.c_cflag |= CS8; // 8 位数据位
tcsetattr(fd, TCSANOW, &options);
4.3 案例拆解:Modbus RTU 通信中的 8E1 帧格式配置
在工业自动化领域,Modbus RTU 协议是应用最广泛的串行通信协议之一。其物理层明确规定使用 RS-485 总线,帧格式固定为 8 数据位、偶校验、1 停止位(8E1),波特率常见为 9600 或 19200。以下是一个实际工程案例:某 PLC 与变频器通过 Modbus RTU 通信,现场出现偶发通信超时。
背景与约束:PLC 主站(西门子 S7-1200)通过 CB1241 RS-485 模块连接 5 台台达变频器,通信距离约 120 米,波特率 19200。现场存在一台 7.5kW 变频器,启动时通信中断。
排查过程:首先使用串口分析仪抓取总线波形,发现变频器启动瞬间,总线电平出现毛刺,且停止位后的空闲电平被拉低约 20μs。进一步检查发现,PLC 侧配置的帧格式为 8N1(无校验),而变频器出厂默认设置为 8E1(偶校验)。由于校验位不匹配,变频器在收到 PLC 的请求帧后,计算校验位失败,导致不响应或响应延迟。
解决方案:将 PLC 的 CB1241 模块参数从 8N1 修改为 8E1,并重新扫描总线设备。修改后,通信恢复正常。同时,在变频器侧将波特率调整为 9600,以降低长线传输的误码率。
复盘经验:在组建多机通信网络前,必须逐一核对从站的帧格式参数。很多设备默认使用偶校验,而部分国产设备默认无校验。建议在项目调试阶段使用支持帧格式解析的串口调试助手,先发送单帧测试命令,观察从站是否返回正确响应。
| 参数项 | 8N1(默认) | 8E1(Modbus) | 8O1 | 7E1 |
|---|---|---|---|---|
| 数据位 | 8 | 8 | 8 | 7 |
| 校验位 | 无 | 偶校验 | 奇校验 | 偶校验 |
| 停止位 | 1 | 1 | 1 | 1 |
| 有效载荷 | 1 字节 | 1 字节 | 1 字节 | ASCII 字符 |
| 错误检测能力 | 无 | 单比特错误 | 单比特错误 | 单比特错误 |
| 典型应用 | 调试、GPS | Modbus、电力 | 部分老式设备 | 短信猫、老式终端 |
4.4 常见误区与总结复盘
误区一:数据位长度与校验位混淆。很多开发者认为配置 8 位数据位加偶校验就是 8 个数据位 + 1 个校验位,但硬件实际发送的是 9 个位。在逻辑分析仪上观察时,会看到 9 个数据位窗口。若接收端配置为 8N1,则会将校验位误认为数据位,导致收到的字节值错误。
误区二:停止位越长越可靠。停止位越长,帧间隔越大,传输效率越低。对于 115200 波特率,1 位停止位下每帧耗时约 86.8μs,而 2 位停止位则需 95.5μs。在高速、大数据量传输场景下,应优先使用 1 位停止位,并通过屏蔽双绞线或光耦隔离解决干扰问题。
误区三:忽略波特率误差累积。当收发双方晶振精度不同(如 ±2% 误差),且一帧包含 10 位(8N1)时,累积误差可能达到 20%。若接收端采样点位于数据位边缘,就会产生帧错误。解决方法是使用带自动波特率检测的 UART 外设,或选用精度高于 ±1.5% 的晶振。
总结:UART 帧格式的配置是串行通信的基础,直接决定了数据传输的正确性与可靠性。工程实践中,应遵循“先确认从站规格书,再配置主站参数,最后用示波器或逻辑分析仪验证波形”的流程。对于多机通信,建议统一采用 8E1 或 8N1 格式,并在应用层增加 CRC 校验,以弥补奇偶校验只能检测单比特错误的不足。掌握帧格式的每一个位的作用,是排查通信故障、优化传输效率的关键能力。