C语言实现CRC检测

关键词: 模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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值