/*********************************************************************************************************
** Function name: CountCrc
** Descriptions: CRC校验码计算子程序
** input parameters: 无
** output parameters: 无
** Returned value:
*********************************************************************************************************/
void CountCrc_8(uint8_t *crc_add,uint16_t num,uint8_t *result)
{
uint16_t i,j;
uint8_t temp=0,temp1=0,temp2=0;
result[0]=0;
for(i=0; i<num+1; i++)
{
temp2=*crc_add;
crc_add++;
for(j=0; j<8; j++)
{
temp1=temp2;
temp2=temp2<<1;
temp=result[0];
result[0]=result[0]<<1;
if(temp1&0x80)
{
result[0]=result[0]+1;
}
if(temp&0x80)
{
result[0]=result[0]^0x07; //生成多项式:X8 + X2 + X + 1
}
}
}
}
/***************************************************************************************************
* 描 述: 检测数组的CRC是否正确,正确返回1,不正确返回0
* 函数原型: void Check_CRC(uint8_t *ptr, uint8_t len)
* 入口参数: ptr数组的起始地址, len数组的长度,包括1字节CRC
* 出口参数:
* 附加信息:
***************************************************************************************************/
uint8_t Check_CRC_8(uint8_t *ptr, uint16_t len)
{
uint8_t crc[2],crc_data[2];
if(len>=3)
{
crc_data[0]=ptr[len-1];
ptr[len-1]=0x00;
CountCrc_8(ptr,(len-1),crc);
if(crc_data[0]==crc[0])
{
ptr[len-1] = crc_data[0];//回复原有的CRC数据
return 1;
}
else {
ptr[len-1] = crc_data[0];
return 0;
}
}
return 0;
}