1、引言
(1). CRC寄存器初始值为 0x00。
(2). CRC-8 的模型为:X8+X2+X1+1,由于8进制数只能0~7位,所以舍去X8位,最后得出多项式:0x07H( 0000 0111 B)。
2、 计算步骤
(1). 预置 8 位寄存器为十六进制 0x00(即全为 0) ,称此寄存器为 CRC 寄存器;
(2). 把第一个 8 位数据与 8 位 CRC 寄存器的相异或,把结果放于 CRC 寄存器;
(3). 检测相异或后的CRC寄存器的最高位(第7位),若最高位为1,CRC寄存器先左移1位,再与多项式0x07H进行异或;若为0,则CRC寄存器左移1位,无需与多项式进行异或。
(4). 重复步骤 3 ,直到右移 8 次,这样整个 8 位数据全部进行了处理;
(5). 重复步骤 2 到步骤 4,进行下一个 8 位数据的处理;
(6). 最后得到的 CRC 寄存器即为 CRC 校验码。
附参考:
数据(16进制):01 03 61 00 00 02 CRC校验:C2文章来源:https://www.toymoban.com/news/detail-596664.html
3、代码的实现(计算法)
/*
* 函数名 :CRC8
* 描述 : 计算CRC8
* 输入 : puchMsg---数据地址,usDataLen---数据长度
* 输出 : 校验值
*/
uint8_t CRC_8(uint8_t *puchMsg, uint8_t usDataLen){
uint8_t uCRC = 0x00;//CRC寄存器
for(uint8_t num=0;num<usDataLen;num++){
uCRC = (*puchMsg++)^uCRC;//把数据与8位的CRC寄存器的8位相异或,结果存放于CRC寄存器。
for(uint8_t x=0;x<8;x++){ //循环8次
if(uCRC&0x80){ //判断最低位为:“1”
uCRC = uCRC<<1; //先左移
uCRC = uCRC^0x07; //再与多项式0x07异或
}else{ //判断最低位为:“0”
uCRC = uCRC<<1; //右移
}
}
}
return uCRC;//返回CRC校验值
}
int main(void) {
uint8_t x[]={0x01 ,0x03 ,0x61 ,0x00 ,0x00 ,0x02};
while(1){
uint8_t wCRC_8 = CRC_8(x,sizeof(x)); //获取CRC8校验值
//输出校验值wCRC_8 即可
}
}
4、在线CRC校验网址
网址: http://www.ip33.com/crc.html.
附参考:
数据(16进制):01 03 61 00 00 02 ===> CRC校验值:C2
文章来源地址https://www.toymoban.com/news/detail-596664.html
到了这里,关于CRC_8 计算方法及代码实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!