ADD8 校验(也常写作 ADD-8、8-bit Sum Check)是一种非常简单的校验方式,广泛用于:
串口通信
MCU 数据帧
Bootloader
Modbus 私有扩展协议
嵌入式数据包
其核心思想是:
对所有数据字节进行“8位累加”,仅保留低8位作为校验值。
一、ADD8 校验原理
假设有一组数据:
01 02 03 04
进行 ADD8 校验:
0x01 + 0x02 + 0x03 + 0x04 = 0x0A
最终:
checksum = 0x0A
1.1 超过 0xFF 怎么办?
ADD8 只保留低 8 位:
例如:
0xF0 + 0x30 = 0x120
保留低8位:
0x20
即:
checksum = sum & 0xFF
二、常见 ADD8 类型
实际工程中常见 3 种:
类型说明| 普通累加和 | 最常见 |
| 取反累加和 | ~sum |
| 补码校验 | 使总和为0 |
三、普通 ADD8算法
Checksum=(∑i=0N−1Datai) mod 256Checksum = \left(\sum_{i=0}^{N-1} Data_i\right) \bmod 256Checksum=(∑i=0N−1Datai)mod256
示例
数据:
11 22 33 44
计算:
0x11 + 0x22 + 0x33 + 0x44 = 0xAA
校验值:
0xAA
四、C 语言实现(普通 ADD8)
( , )
{
;
( ; ; )
{
[];
}
()( );
}
()
{
[] {, , , };
(, );
(, );
;
}输出:
Checksum = 0xAA
五、补码型 ADD8
有些协议要求:
所有字节 + checksum 的结果低8位为 0
即:
(sum + checksum) & 0xFF = 0
那么:
checksum = (~sum + 1)
这其实就是:
二进制补码
Two's Complement
数学表达
Checksum=(256−(∑Datai mod 256)) mod 256Checksum = \left(256 - \left(\sum Data_i \bmod 256\right)\right) \bmod 256Checksum=(256−(∑Dataimod256))mod256
示例
数据:
01 02 03
求和:
0x01 + 0x02 + 0x03 = 0x06
补码:
0x100 - 0x06 = 0xFA
验证:
0x01 + 0x02 + 0x03 + 0xFA = 0x100
低8位:
0x00
校验成功。
六、C实现(补码 ADD8)
( , )
{
;
( ; ; )
{
[];
}
()( ( ));
}
()
{
[] {, , };
(, );
(, );
;
}输出:
Checksum = 0xFA
七、接收端如何校验方法1:重新计算
接收端:
收到数据 + checksum
重新 ADD8:
如果:
计算值 == checksum
则正确。
方法2:总和为0(补码型)
直接:
sum(all bytes) & 0xFF
若结果:
== 0
则正确。
八、ADD8 优缺点
优点缺点| 实现极简单 | 检错能力弱 |
| MCU资源消耗低 | 无法检测部分错误 |
| 速度快 | 不适合高可靠通信 |
| 不需要查表 | 连续bit错误可能漏检 |
九、ADD8 vs CRC
项目ADD8CRC16| 计算复杂度 | 很低 | 较高 |
| 检错能力 | 一般 | 很强 |
| MCU开销 | 极低 | 中等 |
| 常见场景 | 简单协议 | 工业通信 |
| 能检测bit顺序错误 | 差 | 强 |
我要赚赏金
