仿真CAN报文发送的CRC校验算法(附CAPL代码)
创始人
2024-11-04 15:38:54
0

文章目录

  • 前言
  • 一、为什么CAN报文有CRC?
  • 二、怎么确定是否需要做CRC校验?
  • 三、CAPL代码实现CRC算法


前言

关于CRC校验的基本理论、算法实现网上已经有很多介绍文章,本文不再赘述。只是记录在项目测试中真正开发CRC算法并进行测试的一些体会。

一、为什么CAN报文有CRC?

首先从CAN帧结构层面上看,在报文Data后紧跟着的是CRC场,通信收发双方通过约定的算法进行CRC计算来实现数据传输检错功能,以此降低误码率,保证数据传输的正确性和完整性。从应用层面来看车辆的车速档位、Usermode、Carmode等信息需要保证正确传输以达到数据安全。这也是为什么不是所有帧都需要做CRC校验。

二、怎么确定是否需要做CRC校验?

如下图,在DBC或者ARXML中当需要仿真发送的报文中包括checksum和Rollingcounter信号时,就需要进行CRC校验算法开发。这里有几个点需要注意:

  • 仿真发送的报文才需要,接收报文不需要;
  • checksum和Rollingcounter信号名不一定是唯一的,要注意识别。有的可能写CRC、RC等其他形式。当仿真发送报文没有任何作用时,就可以去看看是不是有CRC信号需要算法校验。
  • CRC算法也是多样的,注意根据规范开发。核心数据包括:多项式、初始CRC值、最终异或值。重点是理解CRC算法逻辑,这样不论是在CANoe、TSMaster、Veristand中都可以进行开发。
    在这里插入图片描述

三、CAPL代码实现CRC算法

上面提到,重点是理解CRC算法逻辑然后去有针对性的开发。下面以LIN的CRC为例,使用CAPL进行CRC demo代码的实现。可以根据实际开发需要进行调整。

/*@!Encoding:936*/ includes {    }  variables {   byte i;   linFrame *msg;   int flag;   byte index;   byte crc_item;   byte CRC_CheckSum;   byte crcValue = 0x00;   byte xorValue = 0x00;   byte Frame_Data[7]; }  void SimulationCRC(long MsgID,int CycleTime) {   msg.id = 0x00;   msg.msgChannel = 1;   msg.dlc=8;   msg.rtr = 0;  //RTR在output发送帧时使用,为0将重新配置响应数据;为1向总线发送帧头,配合主模式使用      msg.byte(1) = i + 0x80;   flag = 1;   i++;   if(i == 0xF)   {     i = 0x0;   }   //直接定义byte字节值;或者去定义报文信号   msg.byte(2) = 0x02;   msg.byte(3) = 0x03;   msg.byte(4) = 0x04;   msg.byte(5) = 0x05;   msg.byte(6) = 0xC6;   msg.byte(7) = 0x07;   Frame_Data[0] = msg.byte(1);   Frame_Data[1] = msg.byte(2);   Frame_Data[2] = msg.byte(3);   Frame_Data[3] = msg.byte(4);   Frame_Data[4] = msg.byte(5);   Frame_Data[5] = msg.byte(6);   Frame_Data[6] = msg.byte(7);   if(flag == 1)   {     CRC_CheckSum = crc8Sumu(Frame_Data,7);     flag = 0;   }    msg.byte(0) = CRC_CheckSum;   output(msg);   flag=1; }  on linFrame * {   if(this.id == 0x00)   {      SimulationCRC(0x00, 50);   } }  // ----------------------------------------------- byte crc8Sumu(byte data[], int Datalen) {   byte CRCInitValue = 0x01;   byte CRCPolynomial = 0x02;   byte CRCXORValue = 0x03;    int i, j;   byte Rtn;   Rtn = CRCInitValue;   for (i = 0; i < Datalen; i++)   {     Rtn ^= data[i];   //异或赋值     for (j = 0; j < 8; j++)     {       if (Rtn & 0x80)       {         Rtn = (Rtn << 1) ^ CRCPolynomial; //左移一位后 异或运算       }       else       {         Rtn <<= 1;       }     }   }   Rtn ^= CRCXORValue;   return Rtn; } 

相关内容

热门资讯

连日来!钱塘十三水辅助器软件(... 连日来!钱塘十三水辅助器软件(辅助)一直是真的有辅助教程(存在有挂)所有人都在同一条线上,像星星一样...
目前!微乐广西麻辣辅助器(辅助... 目前!微乐广西麻辣辅助器(辅助)都是是有辅助工具(有挂教学)1)微乐广西麻辣辅助器有没有挂:进一步探...
此事引发网友热议!悟空大厅微信... 此事引发网友热议!悟空大厅微信辅助(辅助)好像是有辅助插件(有挂工具)所有人都在同一条线上,像星星一...
黑科技辅助!上饶辅助(辅助)真... 黑科技辅助!上饶辅助(辅助)真是是真的有辅助方法(有挂辅助)1、完成上饶辅助辅助器v3.3的残局,帮...
第三方技巧!潮友会鱼虾蟹破解(... 第三方技巧!潮友会鱼虾蟹破解(辅助)本来真的有辅助教程(有挂详细)1、潮友会鱼虾蟹破解脚本辅助下载、...
教程辅助挂!闲娱江西脚本(辅助... 教程辅助挂!闲娱江西脚本(辅助)原来是有辅助app(发现有挂)1、进入游戏-大厅左侧-新手福利-激活...
方法辅助挂!齐齐乐哟西辅助制作... 方法辅助挂!齐齐乐哟西辅助制作(辅助)一直确实有辅助神器(新版有挂)1、齐齐乐哟西辅助制作透视辅助软...
明白辅助挂!爱玩联盟辅助软件(... 明白辅助挂!爱玩联盟辅助软件(辅助)都是确实有辅助教程(有挂实锤)1、完成爱玩联盟辅助软件有辅助插件...
有玩家发现!微乐小程序黑科技(... 有玩家发现!微乐小程序黑科技(辅助)其实是有辅助脚本(果真有挂)1、金币登录送、破产送、升级送、活动...
最新消息!蜀渝牌血战到底辅助(... 最新消息!蜀渝牌血战到底辅助(辅助)竟然确实有辅助器(有挂方略)1、蜀渝牌血战到底辅助透视辅助软件激...