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;
}
公式法算E2E校验
于 2023-12-07 09:38:00 首次发布