028-87409729
: 9:00-18:00
17348136089
: 7*24h
奇偶校验是一种用于简单检测二进制数据是否正确的方法。在串行通信中,奇偶校验可以用于检测数据传输的错误。
奇偶校验分为无校验,奇校验,偶校验三种。其原理是在二进制数据的末尾添加一个额外的位,使得数据中二进制 1 的数量为奇数或偶数。这个额外的位被称为校验位。通过在数据的末尾添加一个校验位,可以检测出数据在传输的过程中是否存在错误,从而帮助检测数据的正确性。
使用奇校验时,如果数据中1的个数是偶数,那么校验位设置为1,使得整个数据的1的个数变为奇数。如果数据中1的个数是奇数,那么校验位设置为0,同样使得整个数据的1的个数变为奇数。
当数据在传输过程中出现错误时,例如由于噪声引起了一个二进制位的变化,这个错误就会影响到校验位,导致整个数据的1的个数变成偶数。在接收端,通过检测1的个数是否正确,可以判断数据是否正确。如果1的个数不匹配,就说明数据传输过程中出现了错误。
需要注意的是,奇偶校验只能检测到一位的错误,对于多位错误的检测就需要使用其他更复杂的校验方法。
要使用奇偶校验验证数据,需要适当的硬件设备和软件支持来实现可靠的串行通信和数据错误检测。以下以FT2000为例给大家演示和分析。
FT-2000/4 包含 4 个 UART(Universal Asynchronous Receiver/Transmitter,通用异步接收/发送装置)控制器。其中,三个 3 线制接口,只提供输入、输出和中断线,一个 9 线制接口,提供握手相关接口。
FT-2000/4官方文档对串口奇偶校验使用描述并不清晰,需要注意的是在开启校验功能时比较容易出错。
FT-2000/4共有3个寄存器域控制校验方式。分别为UARTLCR_H下的SPS、EPS和PEN。
PEN为校验的使能位,控制校验的开启与关闭。
ESP为奇偶校验类型选择。用于选择奇校验和偶校验。
SPS为校验方式选择。
其中PEN和EPS比较好理解,是校验使能和奇偶选择。但SPS的描述却比较模糊。从描述来看和PEN差不多,是校验开关。
在RTOS中配置串口为奇校验,设置寄存器为PEN=1,EPS=0,SPS=1。串口定时发送数据包。
将FT-2000/4设备与接收设备连接,接收设备串口无法调试,且能响应其他设备发送的串口数据。
当FT-2000/4设备向对方发送数据后对方设备一直不对发送的数据做出响应。初步判断为接收设备未收到此设备通过串口发送的完整数据帧。
现在接收设备收到数据后没响应,可能是发送设备的问题,也可能是接收设备的问题。那么如何进行验证呢?先将接收设备更换为电脑,若电脑收到了正确数据,则发送设备没问题。那么可能是对端接收设备出了问题。将FT-2000/4串口连接到USB转串口工具。让设备定时发送数据,电脑使用串口调试助手接收数据。
为了找出问题所在,可使用同样的USB转串口工具,在配置相同的情况下使用不同的串口调试助手。然后观察接收的数据是否正确。
测试结果:电脑收到了正确数据。在更换USB转串口工具后。也收到了正确的数据。根据电脑的测试结果来看,发送设备没有任何问题。但接收设备也能对来自其他设备的数据做出响应使用。那么这种验证方式还是没有找到根本问题所在。这说明USB转串口工具并不是完全可靠的。考虑到STM32的芯片具有串口校验错误中断,那么可以再使用一个STM32的设备做一个串口数据转发测试。
参考一个STM32的设备编写程序做数据转发。使用一个端口按奇校验接收数据并启用校验错误中断。收到正常数据后通过另一个串口发送出去,如果收到的数据触发了校验错误则将数据丢弃。STM32转发设备的连接图与配置如下:
此时STM32先连接一个能正常收发数据的串口设备。此设备设置奇校验后发送的数据未触发奇偶检验错误中断,PC收到的数据与设备发送的数据相同。此设备设置偶校验或无校验发送数据时触发奇偶检验错误中断,PC无数据接收。此时说明stm32可正常识别奇偶校验。
将FT-2000/4设备连接STM32后发送一帧数据,PC却只收到部分数据。说明FT-2000/4设备发送的数据存在校验不通过的问题。
通过以上分析已初步确认了是FT-2000/4发送设备的问题,PC又成功接收到了数据。则说明问题可能出在串口配置与使用相关区域。
官方提供了linux镜像,我们将linux镜像烧录后测试。发现在linux中串口设置奇校验后数据发送正常,通过STM32后PC收到了发送的数据。然后在linux中将串口相关寄存器内容打印出来并和RTOS中打印的寄存器内容对比,发现SPS寄存器的值不一样。根据FT-2000/4官方linux内核源码分析驱动程序。相关驱动代码如下[1]:
drivers/tty/serial/phytium-uart.c
驱动中在启用了CMSPAR标记后才将SPS置位。
网上查找CMSPAR相关信息[2],CMSPAR为显示选择标记或空奇偶校验,若已设置奇校验,则奇偶校验位总是1。否则奇偶校验位总是0(空奇偶校验)。即奇偶校验变为了mark和space校验。
从网上串口校验相关资料得知校验分为无校验、奇校验、偶校验、mark校验和space校验。而这个SPS寄存器可能就是奇偶校验和mark与space校验的切换。
将FT-2000/4设备改回RTOS程序并将SPS设置为0。
这次通过STM32转发,PC收到了完整的数据。
这个SPS就是这两种校验的切换寄存器。置0时根据EPS内容设置奇校验或偶校验。置1时根据EPS内容设置mark或space校验。
奇偶标记(mark和space)多用于串口多机通讯中的地址与数据区分。可减少从机的中断次数。
例如:发送设备地址时使用mark校验,发送数据时使用space校验。从机空闲时仅保留mark校验中断。当主机发送带mark校验的地址时从机触发中断,从机判断是否是自己的地址。若是自己的地址则将校验方式改为space校验并准备接收数据。若不是自己的地址则继续等待,后续主机发送数据时不再触发中断。
为什么设备通过USB串口助手连接电脑后即使校验设置错误电脑也能收到正确数据?可能是部分USB串口工具在检测到校验错误后并没有丢弃数据,而是将错误的数据直接发给了电脑。导致了串口调试助手的校验方式与实际不符时也收到了数据。
[1] 内核源码:https://gitee.com/phytium_embedded/phytium-linux-kernel/tree/linux-5.10
[2] 参考文章:https://zhuanlan.zhihu.com/p/617236482