CRC-8通信校验真实示例详解
一、选定标准通用CRC8-0x07多项式0x07初始值0x00无输入反转无输出反转无最终异或适用LIN 总线、传感器、UART、I2C固定规则crc初始值 0x00对每个字节crc crc ^ 字节循环8 次如果得到的crc结果最高位 1则 →crc (crc 1) ^ 0x07否则→crc crc 1二、数据示例待校验数据2 个字节 →0x320x01要算出它的CRC8 校验值三、手动计算全过程初始状态crc 0x00处理第 1 个字节0x32crc crc ^ 0x32 0x00 ^ 0x32 0x32对 0x32 循环8 次移位判断0x32 00110010最高位 0 → 左移 → 0x64最高位 0 → 左移 → 0xC8最高位 1 → 左移 异或 0x07 → 0x97最高位 1 → 左移 异或 0x07 → 0x29最高位 0 → 左移 → 0x52最高位 0 → 左移 → 0xA4最高位 1 → 左移 异或 0x07 → 0x4F最高位 0 → 左移 → 0x9E更详细第 1 次最高位 0 → 左移 1 0011 0010 1 0110 0100 (0x64)第 2 次最高位 0 → 左移 1 0110 0100 1 1100 1000 (0xC8)第 3 次最高位1→ 左移 1 再异或 0x07 0xC8 1 0x90 0x90 ^ 0x07 1001 0111 (0x97)第 4 次最高位1→ 左移 1 再异或 0x07 0x97 1 0x2E 0x2E ^ 0x07 0010 1001 (0x29)第 5 次最高位 0 → 左移 1 0010 1001 1 0101 0010 (0x52)第 6 次最高位 0 → 左移 1 0101 0010 1 1010 0100 (0xA4)第 7 次最高位1→ 左移 1 异或 0x07 0xA4 1 0x48 0x48 ^ 0x07 0100 1111 (0x4F)第 8 次最高位 0 → 左移 1 0100 1111 1 1001 1110 (0x9E) 处理完第 1 字节crc 0x9E处理第 2 个字节0x01crc 0x9E ^ 0x01 0x9F→1001 1111对 0x9F 循环8 次移位判断最终 8 次算完结果crc 0xD4其中8次循环细节最高位 1 → 10x3E ^0x07 0x39最高位 0 → 1 0x72最高位 0 → 1 0xE4最高位 1 → 10xC8 ^0x07 0xCF最高位 1 → 10x9E ^0x07 0x99最高位 1 → 10x32 ^0x07 0x35最高位 0 → 1 0x6A最高位 0 → 1 0xD4四、最终结果数据0x32, 0x01CRC8 校验值 0xD4CRC8(0x32, 0x01) 0xD4五、发送端与接收端完整流程发送端原始数据0x32 0x01计算 CRC80xD4发送0x32 0x01 0xD4接收端收到0x32 0x010xD4对前 2 字节重新计算 CRC8 → 得到 0xD4对比收到的 CRC 与计算值一致 → 数据正确六、可直接运行的 C 代码验证结果c语言#include stdio.h #include stdint.h uint8_t CRC8_Calc(uint8_t *data, uint32_t len) { uint8_t crc 0x00; while(len--) { crc ^ *data; for(int i0; i8; i) { if(crc 0x80) crc (crc 1) ^ 0x07; else crc 1; } } return crc; } int main(void) { uint8_t buf[2] {0x32, 0x01}; uint8_t crc CRC8_Calc(buf, 2); printf(CRC8 0x%02X\n, crc); return 0; }运行输出CRC8 0xD4✅ 和手算完全一致七、示例对应真实场景这就是车载 LIN 总线传感器帧的真实校验0x32 传感器 ID0x01 有效数据0xD4 CRC 校验汽车车窗、雨刮、空调面板 都用这套逻辑。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2543796.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!