公式法算E2E校验

variables
{ 
byte DataID[7][16] = 
  {
    {114,225,31,117,82,182,136,64,25,123,210,39,223,178,156,67},          
  };

}
on timer ADAS_AP2_Timer
{
  ADAS_AP2.SigGroup_0x184_RlngCtr = (ADAS_AP2.SigGroup_0x184_RlngCtr + 1) % 16; //RlngCtr计数
 
  ADAS_Msg.SigGroup_114_ChkSm = ReCalMsgCheckSum(ADAS_Msg, 0, 
  ADAS_Msg.SigGroup_114_RlngCtr);  // 调用Cal CheckSum函数
}




byte ReCalMsgCheckSum(message *msg, byte IdIndex, byte RollingCounter)      // Cal CheckSum函数
}
{
  byte buffer[64];  //定义一个buffer数组
  byte i,bit,ChkSum;  //定义变量
  
  for(i = 1; i < msg.DataLength; i++)   //建立for循环,循环次数是报文长度msg.DataLength
  {
    buffer[i-1] = msg.byte(i);  
  }
  buffer[msg.DataLength-1] = DataID[IdIndex][RollingCounter]; 
  
  ChkSum = 0xFF;     //初始值
  for(i = 0; i < msg.DataLength; i++)  // 报文长度为*,所以需要循环*次
  {
    ChkSum ^= buffer.byte(i);    //每次先与需要计算的数据异或,计算完指向下一数据
    for(bit = 8; bit > 0; bit--)  //多项式宽度为8,所以需要计算8次
    {
      if(ChkSum & 0x80)   //判断最高位是否为1
        ChkSum = (ChkSum << 1) ^ 0x2F;
      else    //最高位为0时,不需要异或,整体数据往左移一位
        ChkSum = ChkSum << 1;
    }
  }
  ChkSum = ChkSum ^ 0xFF;
  
  return ChkSum;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值