当前位置: 首页 > news >正文

通信校验CRC15使用过程示例

一、先明确:CAN CRC15 标准参数

  • 多项式:0x4599
  • 初始值:0x0000
  • 输入不反转、输出不反转
  • 最终异或:0x0000
  • 结果只取低 15 位:crc & 0x7FFF

二、示例数据(模拟 CAN 一段数据)

最简单的 1 字节数据演示,方便手算:待计算数据:0x11


三、手动计算完整过程(逐行详解)

初始

crc = 0x0000


第一步:异或 + 移位

CAN CRC15 处理一个字节时:crc = crc ^ (data << 7)

0x11 << 7 = 0x880

所以:crc = 0x0000 ^ 0x880 =0x880


第二步:循环 8 次,逐位处理

规则:

  • 若 crc最高位(第 15 位,0x4000)= 1crc = (crc << 1) ^ 0x4599
  • 否则→crc = crc << 1

当前 crc =0x880(二进制:0000100010000000)最高位 0x4000? →

开始 8 轮:

  1. 第 1 次:0x880 << 1 =0x1100
  2. 第 2 次:0x1100 << 1 =0x2200
  3. 第 3 次:0x2200 << 1 =0x4400现在最高位 0x4000 = 1→ 0x4400 <<1 = 0x8800 ^ 0x4599 =0xCD99
  4. 第 4 次:最高位 = 1→ 0xCD99<<1=0x9B32 ^ 0x4599 =0xDECB
  5. 第 5 次:最高位 = 1→ 0xDECB<<1=0xBD96 ^ 0x4599 =0xF80F
  6. 第 6 次:最高位 = 1→ 0xF80F<<1=0xF01E ^ 0x4599 =0xB587
  7. 第 7 次:最高位 = 1→ 0xB587<<1=0x6B0E ^ 0x4599 =0x2E97
  8. 第 8 次:最高位 = 0→ 0x2E97 <<1 =0x5D2E

四、最终 CRC15

crc = 0x5D2E只取 15 位:CRC15 = 0x5D2E & 0x7FFF = 0x5D2E


五、C 代码验证(工程版)

#include <stdint.h> uint16_t CAN_CRC15(uint8_t *data, uint32_t len) { uint16_t crc = 0x0000; while (len--) { crc ^= (uint16_t)*data++ << 7; for (int i = 0; i < 8; i++) { if (crc & 0x4000) crc = (crc << 1) ^ 0x4599; else crc <<= 1; } } return crc & 0x7FFF; } // 测试 #include <stdio.h> int main() { uint8_t data[] = {0x11}; uint16_t crc = CAN_CRC15(data, 1); printf("CAN CRC15 = 0x%04X\n", crc); return 0; }

运行结果:

CAN CRC15 = 0x5D2E

和手算完全一致 ✅


六、这个示例在 CAN 里的真实意义

  • 0x11 可以是 CAN 帧里的1 字节数据段
  • 0x5D2E 就是会被放到CRC 场的校验码
  • 接收方收到后,用同样算法再算一遍 → 结果一样 = 数据无错
http://www.jsqmd.com/news/683346/

相关文章:

  • 运维笔记:处理中标麒麟服务器试用授权后,别忘了检查磁盘挂载和Yum源配置
  • 2026年汉语言文学论文降AI工具推荐:文学批评和语言分析部分降AI指南 - 还在做实验的师兄
  • 告别绿幕束缚:用OBS背景移除插件打造专业直播画面
  • pikaqiu靶场实战笔记(1):从暴力破解到文件上传的渗透路径
  • STM32物联网设备免配置联网:用CubeMX+LwIP实现DHCP自动获取IP(含HostName设置避坑指南)
  • 架构设计 Skill
  • 初中数学提分利器:手把手教你搞定因式分解的十字相乘和公式法(附口诀)
  • 别再让图像有暗角了!用OpenCV和Python给工业相机做个平场校正(附完整代码)
  • 从康复理疗到智能假肢:sEMG特征提取如何在实际项目中落地?我的5个踩坑经验分享
  • TwitchDropsMiner完整教程:零带宽自动获取游戏掉落奖励
  • 别再死记硬背了!用DSP28335的ADC+DMA实现多通道数据采集,这份配置清单请收好
  • 别再只会打两拍了!手把手教你搞定跨时钟域信号处理的三种实战场景(单bit/多bit/异步FIFO)
  • 3步实现知网文献批量下载:CNKI-download自动化工具完全指南
  • AngularJS SQL
  • 用STM32F1的定时器玩点花的:PWM呼吸灯、编码器测速、输入捕获测频一站式搞定
  • 告别PyInstaller打包DLL缺失:从ImportError到一键部署的实战指南
  • 2026年生物技术论文降AI工具推荐:基因研究和生物工程部分降AI攻略 - 还在做实验的师兄
  • d2s-editor:5分钟学会暗黑破坏神2存档修改,轻松打造完美角色
  • 移动网络下,为何你的公网IP成了‘隐形地址’?
  • 【仅限首批200家认证企业开放】:2026规范合规自检工具链V1.0正式解禁——含静态分析规则包、运行时防护桩、以及NASA/JPL验证过的37个边界用例
  • 从PCIe 2.0到5.0:时钟电平HCSL与LP-HCSL的演进史,以及如何为你的新设计选型
  • 从暗电流到信噪比:手把手教你用Python+Arduino搭建PD(光电二极管)性能测试平台
  • 在Windows上用Anaconda配置BiSeNet V2训练环境,避开Linux依赖的坑
  • 【VASP】QVASP 实战:从安装到 ELF 电荷局域函数计算
  • ORAN前传延迟实战:手把手教你配置O-DU与O-RU的时间窗(含eCPRI测量避坑)
  • 3步解决方案:使用s7netplus实现西门子PLC数据采集与自动化控制
  • Project Eye护眼工具:拯救数字工作者视力的智能守护者
  • 从GitHub Issues到个人学习计划:Mermaid甘特图的5个意想不到的实用场景
  • Semi Design v2.95.0 发布:Input 等组件功能更新,多组件问题修复
  • 2026年电子商务论文降AI工具推荐:平台运营和用户行为研究降AI方案 - 还在做实验的师兄