关键词: 模2运算
/**
* @brief 将信息码 data 与多项式 div 进行模2运算,返回余式,得到多项式的阶数step
*/
int __modular_2_calc(int data,int div,int *step)
{
u8_t buff[32] = {0};
*step = -1;
int i = 0;
int tmp;
tmp = div;
// 得到多项式阶数
while (tmp)
{
(*step)++;
tmp >>= 1;
}
data = data << *step;
tmp = data;
while(tmp){
buff[i++] = tmp%2;
tmp /= 2;
}
i -= (*step+1);
int fcs = data >> i;
i--;
while (1)
{
if(fcs&(1 << *step)){
fcs = fcs ^ div;
}else{
fcs = fcs ^ 0;
}
// printf("result:%#x,%d\n",fcs,buff[i]);
if(i > -1){
fcs = fcs << 1 | buff[i--];
}else{
break;
}
}
return fcs;
}
/**
* @brief 由信息码得到传输码,传输码格式:信息码|帧检测(FCS)
*/
int gen_crc_fram(int data,int div)
{
int step;
int fcs = __modular_2_calc(data,div,&step);
data <<= step;
return data |= fcs;
}
/**
* @brief 检查得到的信息码余数如果为零,通过crc检验。否则返回错误。
*/
int check_crc_fram(int data,int div)
{
int step;
printf("data:%#x\n",data);
if(__modular_2_calc(data,div,&step) == 0){
return data >> step;
}else{
printf("crc check err!!\n");
return -1;
}
}
int main(int argc, char* argv[])
{
// demo 演示
int data = gen_crc_fram(1021,19);
printf("receive data:%d\n",check_crc_fram(data,19));
return 0;
}