您好,欢迎访问飞畅科技官网!
服务热线:+086 0571-87007055/56/57 EN
飞畅科技工业通信技术中心

光通信与工业互联网方案专家

EXPERT IN OPTICAL COMMUNICATION & INDUSTRIAL INTERNET SOLUTIONS

联系我们CONTACT US

全国咨询热线

0571-87007055/56/57/75

市场部直线电话:0571-87007140

手机:15306818230(微信)

QQ :2355416925

定制设计:18072828031(微信)

或给我们留言

在线留言

奇偶校验为什么会漏掉错误?串口校验位与数据正确性的边界科普

浏览次数:飞畅科技原创作者:飞畅科技技术团队

FIBERIOT / 基础知识

串口设置里有“无校验、奇校验、偶校验”,选了偶校验,是不是就能保证收到的数据正确?不能。它像每个字符旁边的一道简短检查题,能发现一部分错误,却不知道原来的内容究竟是什么。要用好这道检查题,先看清它检查的范围,再沿着设备的数据路径找证据。

8E1字符中起始位、八个数据位、偶校验位和停止位的位置
图1:以0x41为例说明8E1与偶校验计数;通用逻辑示意,AI辅助原创绘制,非实测。

01先认清:它检查的是字符,不是整条业务消息

UART是通用异步收发器的缩写,通常是芯片里负责把字节排成串行比特、再把比特收回字节的部分。发送一项仪表读数时,软件交给它的往往是多个字节;UART逐个发送字符,在每个字符前后加上用于辨认边界的起始位和停止位,配置允许时再加一个校验位。业务消息与串口字符,是两种不同大小的容器。

RS232、RS485主要规定电气接口怎样表达和传送信号,奇偶校验则属于字符格式。换成RS485,或者中间增加光纤传输,并不会自动让字符具有更强的内容检查能力。线路灯亮、设备能收到字节,也只说明某一层正在工作,不能代替对业务内容的确认。

还要区分“一个字符的起始位置”和“整条消息的开始”。UART能重新识别下一个起始位,不代表它知道哪个字节是地址、哪个是命令。消息从哪里开始、在哪里结束,通常由上层协议约定。若忽略这一点,即使每个字符都通过校验,应用仍可能把几个正确字节拼成一条错误消息。

02偶校验并不是“校验位永远为零”

所谓偶校验,是让“数据位加校验位”中值为1的比特总数成为偶数。奇校验则要求总数为奇数。接收端按相同规则再数一次,发现不符合约定,就知道这一字符值得怀疑。校验位有时为0、有时为1,取决于当前数据,并不是偶校验固定发送0、奇校验固定发送1。

以字符A为例,它常用的字节值是十六进制0x41,八位数据中有两个1。采用8E1格式时,8表示八个数据位,E表示偶校验,1表示一个停止位。因为两个1已经是偶数,校验位取0即可。常见UART先发最低有效位,图中按D0到D7排列;这与把二进制数字写在纸上时的高位在左,不是同一种阅读顺序。

这次计数只包括约定的数据位和校验位,不把起始位、停止位混进去。起始位负责提示字符开始,停止位给接收器提供结束处的格式检查机会。它们各有任务,不应因为在线路上相邻,就认为全都属于奇偶校验的范围。

无校验方式不会发送这一个奇偶校验位,数据位本身仍然照常发送。它适合哪些业务,由实际协议与设备设计决定。不能只因为上层另有校验,就擅自把双方的字符格式改掉;通信两端首先必须按相同约定解释每个位置,然后才谈得上比较收到的内容。

03只翻转一位与翻转两位,结果为什么不同

仍看这个例子:原来的D0为1,假设受干扰后被读成0,其余数据和校验位不变,接收端只数到一个1。偶数变成奇数,检查便能发现异常。这里讨论的是已经被接收器解释成比特的结果,不把真实模拟噪声简单等同于某一种固定出错模式。

再假设D0从1变0,同时D1从0变1。原来有两个1,后来仍有两个1,偶校验会通过,但收到的字节已经改变。原因很直观:这道题只保留了“总数是奇还是偶”这一点信息,没有保存每个位置的答案。对于固定边界内的数据位和校验位,奇数个比特翻转会改变奇偶性,偶数个翻转不会。

因此,校验通过的准确含义是“没有发现违反这项规则”,而不是“与原文逐位相同”。奇偶校验也不能指出哪一位错了,不能据此把原始字节修回来,更不能认证是谁发送的内容。正常通信中的丢字节、重复字节或消息顺序错误,也需要其他证据判断。

原始字符、单比特翻转和双比特翻转的偶校验对比
图2:固定字符边界内的假设翻转例子;校验通过不能证明内容完全正确。飞畅原创示意,非错误概率测试。

04设备发现错误后,会怎样处理

接收器通常先根据本地时钟取样,整理出数据位,检查字符格式,再把结果交给接收缓冲和软件。某些芯片会同时给出奇偶校验错误标志。至于错误字符是否继续进入缓冲、软件是否丢弃、是否累加计数或上报告警,要看芯片手册、驱动和产品固件,不能从UART这几个字推出统一答案。

这也是现场看不到错误计数时,不能马上断言“线路没有错误”的原因:设备可能没有开放该计数,采集软件可能没有保留标志,或者观察的位置已经在处理之后。应先问清这项数据从哪里来、覆盖哪个端口、是否在重启后清零,再把时间和业务异常对齐。

05经过串口服务器,检查范围又变了一层

串口服务器接到字符后,可能把字节放进缓冲,再装入网络报文发送。网络段会执行自己的校验,但检查的对象是重新封装后的网络数据。如果某个错误字节已经作为普通内容交给封装程序,网络侧完全可能把它正确地送到上位机;“网络没有坏帧”并不能反证最初串口字符一定无误。

反过来,如果字符在前级被丢弃,后级也无法凭一项通过的检查还原它。业务协议需要按自己的规定检查消息长度、序号、校验字段和超时等条件。CRC也是查错手段,不等于加密或身份认证;是否存在这些字段、怎样处理失败,要以实际协议为准,不能给所有串口业务套同一规则。

串口接收检查、缓冲、网络封装及各段检查边界
图3:串口与网络检查覆盖的范围不同;处理方式取决于实现,非具体型号内部电路。

06排查时,先固定格式,再寻找证据

先记录通信双方的波特率、数据位、校验方式和停止位,并核对每一段会重新收发字符的设备。两端只写着“9600”仍然不够,8E1与8N1对字符后半段的解释并不相同。不要为了暂时看到字符就随意关闭校验;这可能只是把告警入口关掉,并没有消除问题。

然后用已知内容做受控测试,分别保存发送字节、接收字节、错误标志和时间,必要时在合适的逻辑侧观察波形。UART逻辑电平、RS232电压与RS485差分信号不是同一测试点,测量前要确认仪器、接地及安全条件。通过前后对照定位问题,通常比只看终端窗口是否出现乱码更有效。

测试记录也应避免只保存屏幕上显示的文字。有些字节不可打印,显示程序可能用空格、问号或省略来代替;字符编码不一致,还会让相同字节显示成不同文字。保存原始字节的十六进制记录,并注明数据来源,才能区分“传输内容改变”和“显示解释不同”。

07选设备时,看清“传输”与“检查”的区别

飞畅官网有16路RS232/422/485光猫等真实产品,说明串行接口可以借助光纤延长传输路径。但光纤传输本身不等于替业务内容作保证,也不能据产品名称推断支持某种错误计数、报文校验或纠错能力。采购和联调时,应针对具体型号确认字符格式、适用速率、错误处理以及诊断接口。

记住三句话就够了:格式必须约定一致;通过某项检查,只能说明没有发现它能发现的问题;判断业务是否可信,还要继续核对消息边界、有效状态和应用规则。这样理解奇偶校验,既不会低估它的价值,也不会把它当成万能保险。

如果诊断界面只给出一个总错误数,还要确认它是否混合了奇偶错误、停止位不合格式以及缓冲来不及处理的溢出。它们可能表现相似,成因却不相同。把错误类型拆开,再比较端口、负载和发生时间,才有依据决定下一步查格式、查线路,还是查软件取数速度。

资料依据

字符结构与同步说明:Texas Instruments:UART protocol and error overview。校验位生成与错误标志:Microchip:USART Parity。查错边界参考:Microchip:Serial Interfaces and Bus Error Management。真实产品依据:飞畅16路RS232/422/485光猫。芯片资料用于解释通用机制,不表示飞畅产品使用该芯片或具备其全部功能。

现场常见问题

偶校验的校验位一定是0吗?

不是。偶校验要求数据位加校验位中1的总数为偶数:数据已有偶数个1时取0,已有奇数个1时取1。起始位和停止位不计入这一规则。

校验通过,为什么仍可能收到错误内容?

奇偶校验只保留奇偶性这一项信息。在固定字符边界内,同时翻转偶数个数据位或校验位不会改变奇偶性,因此可能漏检,也不能据此恢复原始字节。业务还要执行实际协议规定的完整性检查。

串口服务器的网络检查能替代奇偶校验吗?

不能。网络段检查重新封装后的数据;前级已接收的错误字节可能被正确封装,前级已丢弃的内容也不能靠后级校验恢复。应分别核对字符格式、设备错误处理与应用报文规则。

适用边界与延伸阅读

通用字符校验与设备处理示意,非实测,不保证特定型号使用同一内部实现。

以太网CRC与FCS原理;串口BREAK与字符边界