CRC_8 计算方法及代码实现

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

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
在这里插入图片描述

  • 6
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_755682240

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值