通讯工程-数据帧校验CRC
CRC(循环冗余校验)参数是定义 CRC 算法具体实现方式的一组配置值,不同的参数组合会产生不同的 CRC 校验结果。以下是 CRC 算法的核心参数及其说明:
CRC-8/MAXIM 算法是一种单字节循环冗余校验(CRC)算法,常用于嵌入式系统和通信协议中(如串口通信),用于检测数据传输过程中的错误。以下是其详细说明:
一、算法基本参数
参数 | 值 | 说明 |
---|---|---|
生成多项式 | x⁸ + x⁵ + x⁴ + 1 | 对应十六进制为 0x31 (注意:最高位的 x⁸ 省略,仅取低 8 位系数)。 |
初始值 | 0x00 | 校验计算的初始寄存器值。 |
输入数据处理 | 每个字节逐位处理(先传最高位 MSB) | 按字节顺序处理数据,每个字节从最高位开始输入算法。 |
输出结果 | 单字节(8 位)CRC 校验值 | 计算完成后,寄存器值即为 CRC 校验码。 |
是否反转输出 | 否 | 直接输出寄存器值,无需反转字节或位顺序。 |
二、算法原理与计算步骤
1. 核心思想
通过生成多项式对输入数据进行模 2 除法运算,得到的余数即为 CRC 校验值。其数学表达式为:D(x)⋅x**n≡R(x)modG(x) 其中:
- D(x) 是输入数据多项式,
- G(x)=x8+x5+x4+1 是生成多项式,
- R(x) 是余数(即 CRC 值),
- n=8(生成多项式的最高次数)。
2. 计算步骤(以单字节数据为例)
假设当前处理字节为 data
,寄存器当前值为 crc
(初始为 0x00
),步骤如下:
- 异或操作:将
crc
的高 8 位与data
异或,得到中间值temp
。tem**p=(crc>>8)⊕dat**a - 多项式除法:对
temp
的每一位(从最高位到最低位)进行处理:- 若当前位为
1
,则temp
与生成多项式0x31
异或; - 若为
0
,则不做处理。 处理后,temp
左移一位(最低位补 0),重复此过程 8 次,直至所有位处理完毕。
- 若当前位为
- 更新寄存器值:将处理后的
temp
作为新的crc
低 8 位,高 8 位补 0,进入下一字节的计算。
3. 完整流程(多字节数据)
初始化
crc = 0x00
。对每个字节
```
data
```
in 数据序列:
- `crc = crc << 8`
- `crc = crc | data`
- 按上述单字节步骤计算新的 `crc`。
- 所有字节处理完毕后,
crc
的低 8 位即为最终校验值。
一、CRC 核心参数详解
1. 生成多项式(Polynomial)
- 定义:CRC 算法的数学基础,用二进制多项式表示,如
x⁸ + x⁵ + x⁴ + 1
对应二进制100110001
(省略最高位 1 后为00110001
,即0x31
)。 - 作用:决定了 CRC 计算中模 2 除法的规则。
- 常见值:
- CRC-8/MAXIM:
0x31
- CRC-8/ITU:
0x07
- CRC-16/IBM:
0x8005
- CRC-32:
0x04C11DB7
- CRC-8/MAXIM:
2. 初始值(Initial Value)
- 定义:CRC 寄存器的初始值,影响计算的起点。
- 常见值:
- CRC-8/MAXIM:
0x00
- CRC-16/IBM:
0x0000
- CRC-32:
0xFFFFFFFF
- CRC-8/MAXIM:
3. 输入数据反转(Reflect Input)
- 定义:是否将输入数据的每个字节按位反转(如
0x01
→0x80
)。 - 作用:适配不同的数据传输顺序(MSB 优先或 LSB 优先)。
- 常见值:
- CRC-8/MAXIM:不反转(
false
) - CRC-16/IBM:反转(
true
)
- CRC-8/MAXIM:不反转(
4. 输出结果反转(Reflect Output)
- 定义:是否将最终 CRC 值按位反转。
- 常见值:
- CRC-8/MAXIM:不反转(
false
) - CRC-16/IBM:反转(
true
)
- CRC-8/MAXIM:不反转(
5. 结果异或值(XOR Output)
- 定义:将最终 CRC 值与该值异或后作为校验结果。
- 常见值:
- CRC-8/MAXIM:
0x00
- CRC-32:
0xFFFFFFFF
- CRC-8/MAXIM:
二、CRC 参数组合示例
标准名称 | 生成多项式 | 初始值 | 输入反转 | 输出反转 | 结果异或值 |
---|---|---|---|---|---|
CRC-8/MAXIM | 0x31 | 0x00 | false | false | 0x00 |
CRC-8/ITU | 0x07 | 0x00 | false | false | 0x55 |
CRC-16/IBM | 0x8005 | 0x0000 | true | true | 0x0000 |
CRC-32 | 0x04C11DB7 | 0xFFFFFFFF | true | true | 0xFFFFFFFF |
三、CRC-8/MAXIM 参数详解
结合前文中的通信协议,其使用的 CRC-8/MAXIM 参数为:
- 生成多项式:
0x31
(对应多项式x⁸ + x⁵ + x⁴ + 1
) - 初始值:
0x00
- 输入反转:
false
(按字节原始顺序处理) - 输出反转:
false
(直接输出计算结果) - 结果异或值:
0x00
(不做异或处理)
计算示例:
输入数据 0xAA, 0x03, 0x08
的 CRC 校验值计算步骤:
- 初始化
crc = 0x00
。 - 对每个字节执行:
crc = crc ^ 字节值
- 对
crc
的每一位进行处理(若最高位为 1,则异或0x31
,否则左移)。
- 最终
crc
即为校验值(此处结果为0x00
)。
四、参数不一致的影响
若发送方和接收方使用的 CRC 参数不同(如生成多项式或初始值不一致),会导致:
- 接收方计算的 CRC 与发送方附加的 CRC 不匹配,即使数据未出错也会误判为传输错误。
- 需确保通信双方使用完全相同的 CRC 参数配置。