1. 串口校验机制的本质作用
在串口通信中,奇偶校验(Parity Check)是最基础的数据校验方式之一。它的核心作用是通过增加一个冗余位,使得整个数据帧(包括数据位和校验位)中"1"的个数保持奇数或偶数。这种看似简单的机制,实际上在低速串行通信中能有效检测约50%的单比特错误。
奇偶校验分为三种模式:
- 无校验(None):不进行校验
- 奇校验(Odd):确保"1"的总数为奇数
- 偶校验(Even):确保"1"的总数为奇数
以传输字节0b01011011(0x5B)为例:
- 奇校验:原始数据有5个"1"(奇数),校验位为0
- 偶校验:校验位需设为1,使总"1"数变为6(偶数)
2. 硬件层与协议层的校验分工
现代串口通信芯片(如16550 UART)通常内置了完整的校验功能。当我们在串口初始化时设置校验模式后,硬件会自动完成以下工作:
-
发送端:
- 计算数据位的"1"的个数
- 根据校验模式添加校验位
- 组装完整的帧结构(起始位+数据位+校验位+停止位)
-
接收端:
- 检查接收到的"1"的总数是否符合校验规则
- 在状态寄存器中设置校验错误标志(如UART_LSR_PE)
关键点在于:校验过程完全由硬件自动完成,应用层通常只需要读取状态寄存器即可获知校验结果,无需自行计算校验位。
3. 应用层处理校验错误的典型方案
虽然硬件能自动检测校验错误,但如何应对错误需要应用层逻辑。以下是几种常见处理策略:
3.1 直接丢弃错误数据
c复制while(1) {
if(UART_GetStatus() & UART_ERROR_PARITY) {
uint8_t dummy = UART_ReadData(); // 读取并丢弃错误数据
continue;
}
valid_data = UART_ReadData();
// 处理有效数据...
}
3.2 错误计数与阈值处理
python复制error_count = 0
MAX_ERRORS = 3
while True:
data, status = ser.read()
if status & serial.P
