3. 故障检测基础:故障检测的数学原理

各位工程师朋友,咱们今天聊聊故障检测的数学底子。说实话,我刚入行那会儿,觉得这些数学公式离实际工程很远。直到有一次,一个CRC校验没选对多项式,整批板子在高温下疯狂报错……嗯,从那以后我再也不敢小看这些“纸面上的东西”了。

3.1 奇偶校验:最简单的守护者

奇偶校验,说白了就是数“1”的个数。你想想看,一个字节8个bit,我们给它加一个额外的bit,让整个数据里“1”的总数保持奇数或偶数。

奇校验:数据中“1”的个数加上校验位,总数为奇数。
偶校验

举个例子:

数据:1011010(4个1)
偶校验位:0(保持偶数个1)
发送:10110100

数据:1011011(5个1)
偶校验位:1(凑成偶数个1)
发送:10110111

我在项目中遇到过一件事:一个串口通信模块,用了奇校验,结果偶尔出现误码。排查了半天,发现是校验位在传输过程中被干扰了。你想想看,奇偶校验只能检测奇数个bit的错误,如果两个bit同时翻转,它就“视而不见”了。

注意:奇偶校验的检测覆盖率只有50%。它只能检测奇数位错误,偶数位错误完全漏检。别指望它对付复杂故障。

3.2 CRC校验:工业界的标准答案

CRC(循环冗余校验)比奇偶校验强大多了。它的核心思想是什么?把数据看作一个巨大的二进制数,然后用一个固定的多项式去除它,余数就是校验码。

我个人习惯用CRC-16或CRC-32。为什么?因为它们的检测覆盖率接近100%。

CRC的计算步骤:

  1. 选择一个生成多项式G(x),比如CRC-16常用x¹⁶ + x¹⁵ + x² + 1
  2. 在数据后面补上多项式最高次幂个0
  3. 用多项式做模2除法(其实就是异或运算)
  4. 余数就是CRC校验码

来看一个简单的例子,用CRC-3(多项式x³ + x + 1)计算数据1011:

数据:1011
补3个0:1011000
多项式:1011(对应x³ + x + 1)

除法过程:
    1011 ) 1011000
          1011
          ----
          0000
          0000
          ----
          0000
          0000
          ----
          0000

余数:000
CRC码:000
发送:1011000

嗯,这个例子刚好整除。但实际中很少这么巧。

关键点:CRC的检测能力取决于生成多项式。好的多项式可以检测:

  • 所有单bit错误
  • 所有双bit错误
  • 所有奇数个bit错误
  • 所有长度不超过多项式阶数的突发错误

我曾经踩过一个坑:选了一个多项式阶数太低的CRC,结果在高速数据链路上,连续的错误根本检测不出来。后来换成CRC-32,问题就解决了。所以,别省那点计算资源,选高阶多项式更稳妥。

3.3 检测覆盖率:你到底能抓住多少错误?

检测覆盖率,说白了就是“故障能被检测到的概率”。它不是100%,永远不是。

覆盖率公式:

检测覆盖率 = 可检测故障数 / 总故障数 × 100%

举个例子:

校验方法 检测覆盖率 适用场景
奇偶校验 约50% 低速、低要求通信
CRC-8 约99.6% 短数据包、嵌入式系统
CRC-16 约99.998% 工业总线、存储设备
CRC-32 约99.9999% 网络通信、文件校验

你想想看,为什么CRC-32的覆盖率这么高?因为它用了32位的余数空间,碰撞概率极低。但注意,覆盖率不是绝对的——它依赖于错误模型。

我的建议:

  • 对安全性要求高的系统,别只用一种校验方法
  • 可以组合使用:比如CRC+奇偶校验,或者CRC+汉明码
  • 实际测试时,注入已知故障,验证覆盖率是否达标

3.4 实战中的选择策略

说了这么多理论,到底怎么选?我一般按这个思路来:

  1. 先看错误类型:是随机bit翻转,还是突发错误?
  2. 再看数据量:小数据包用CRC-8就够了,大数据包得上CRC-32
  3. 最后看硬件资源:有些MCU有硬件CRC模块,用起来几乎零开销

举个例子,我之前做的一个传感器节点:

  • 数据包只有8字节
  • 通信环境有强电磁干扰
  • MCU是低端8位机

我选了CRC-8,配合奇偶校验。为什么?CRC-8能检测大部分错误,奇偶校验补上单bit错误的快速检测。两者加起来,覆盖率超过99.9%。而且计算量小,不拖累实时性。

避坑指南:我曾经见过有人用CRC-32校验一个只有2字节的数据。这不是不行,但浪费。CRC-32的余数空间是32位,而数据才16位,碰撞概率极低,但计算开销却很大。选合适的,别选最大的。

好了,这一章就到这里。记住:故障检测不是万能的,但没有故障检测是万万不能的。下一章咱们聊聊容错机制,看看检测到故障后怎么处理。

专注资料整理