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

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,偶校验会通过,但收到的字节已经改变。原因很直观:这道题只保留了“总数是奇还是偶”这一点信息,没有保存每个位置的答案。对于固定边界内的数据位和校验位,奇数个比特翻转会改变奇偶性,偶数个翻转不会。
因此,校验通过的准确含义是“没有发现违反这项规则”,而不是“与原文逐位相同”。奇偶校验也不能指出哪一位错了,不能据此把原始字节修回来,更不能认证是谁发送的内容。正常通信中的丢字节、重复字节或消息顺序错误,也需要其他证据判断。

04设备发现错误后,会怎样处理
接收器通常先根据本地时钟取样,整理出数据位,检查字符格式,再把结果交给接收缓冲和软件。某些芯片会同时给出奇偶校验错误标志。至于错误字符是否继续进入缓冲、软件是否丢弃、是否累加计数或上报告警,要看芯片手册、驱动和产品固件,不能从UART这几个字推出统一答案。
这也是现场看不到错误计数时,不能马上断言“线路没有错误”的原因:设备可能没有开放该计数,采集软件可能没有保留标志,或者观察的位置已经在处理之后。应先问清这项数据从哪里来、覆盖哪个端口、是否在重启后清零,再把时间和业务异常对齐。
05经过串口服务器,检查范围又变了一层
串口服务器接到字符后,可能把字节放进缓冲,再装入网络报文发送。网络段会执行自己的校验,但检查的对象是重新封装后的网络数据。如果某个错误字节已经作为普通内容交给封装程序,网络侧完全可能把它正确地送到上位机;“网络没有坏帧”并不能反证最初串口字符一定无误。
反过来,如果字符在前级被丢弃,后级也无法凭一项通过的检查还原它。业务协议需要按自己的规定检查消息长度、序号、校验字段和超时等条件。CRC也是查错手段,不等于加密或身份认证;是否存在这些字段、怎样处理失败,要以实际协议为准,不能给所有串口业务套同一规则。

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。起始位和停止位不计入这一规则。
校验通过,为什么仍可能收到错误内容?
奇偶校验只保留奇偶性这一项信息。在固定字符边界内,同时翻转偶数个数据位或校验位不会改变奇偶性,因此可能漏检,也不能据此恢复原始字节。业务还要执行实际协议规定的完整性检查。
串口服务器的网络检查能替代奇偶校验吗?
不能。网络段检查重新封装后的数据;前级已接收的错误字节可能被正确封装,前级已丢弃的内容也不能靠后级校验恢复。应分别核对字符格式、设备错误处理与应用报文规则。
适用边界与延伸阅读
通用字符校验与设备处理示意,非实测,不保证特定型号使用同一内部实现。


