#define CRCDEF 0xA001 //参与CRC运算的常数
//*************************************
// 函数名称:CrcCal
// 函数功能:Crc校验计算
// 入口参数:无
// 出口参数:无
//***************************************
uint8 CrcCal(uint8 *Indat,uint8 DatLong)
{
uint8 j,i;
uint16 crc = 0xffff;
for(i=0;i<DatLong;i++)//5 <=5
{
crc = crc^(Indat[i]) ;
for(j=1;j<=8;j++)
{
if((crc&1)==1)
{
crc=(crc>>1) ^ CRCDEF ;//0xA001
}
else
{
crc=crc>>1;
}
}
}
CrcH = (crc & 0xff00)>>8 ; //高八位 在前
CrcL = crc & 0x00ff ; //低八位 在后
return 0;
}
方法描述如下:
CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或(异或:二进制运算 相同为0,不同为1;0^0=0;0^1=1;1^0=1;1^1=0), 之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移出CRC寄存器)如果为1,则把寄存器与预定义的多项式码进行异或,否则如果LSB为零,则无需进行异或。重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个数据似的8次移位。所有的字符处理完成后CRC寄存器内的值即为最终的CRC值。
1.设置CRC寄存器,并给其赋值FFFF(hex)。
2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。
3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。
4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。
5.重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。
6.重复第2至第5步直到所有数据全部处理完成。
7.最终CRC寄存器的内容即为CRC值。
CRC(16位)多项式为 X16+X15+X2+1,其对应校验二进制位列为1 1000 0000 0000 0101。
crc校验计算代码_单片机
版权申诉
196 浏览量
2022-09-21
03:00:52
上传
评论
收藏 1KB ZIP 举报
周楷雯
- 粉丝: 80
- 资源: 1万+
最新资源
- 基于FREERTOS、LCD1602、MCP3202(SPI接口)2通道ADC采集proteus仿真设计
- 基于 Java+NLP的微博舆情分析系统
- 基于Python+NLPIR的网易新闻舆情分析系统
- 基于STM32F103C8T6、LCD1602、MCP3204的 4通道12位ADC转换proteus仿真设计
- 字模转换软件,适用微雪汉字库
- 实现函数P197.4.ms11
- 基于python+flask的舆情分析系统,包括爬虫、可视化、数据分析、情感分析等模块
- 文本检测-基于Pytorch实现的可微分二值化实时场景文本检测算法-附项目源码-优质项目实战.zip
- 8.2.cpp
- 开源流媒体框架ZLMediaKit C API JAVA实现,打造属于自己的流媒体服务
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0