传输六个字节,最后一个字节是校验码,生成多项式为g(x) = X^8+X^2+X+1; 陪集码为FFh ,G(x)模2除前5个字节,生成余式R(x),R(x)补码作为校验码.我不想用查表法。

解决方案 »

  1.   

    BYTE CRC8;
    BYTE tabdata;
    unsigned int datanum;
    BYTE c,t;
    CRC8 = 0x00;                        //初值为0
    datanum = 0;
    while(len--)                      //每次循环处理一个字节
    {
    c = DataBuf[datanum];         //新移进来的字节值 t = (CRC8>>4) & 0x0F;         //要移出的半字节的值
    tabdata = CRC_8_tab[t];       //根据移出的半字节的值查表
    CRC8 = (CRC8<<4) | c>>4;      //将新移进来的高位半字节值添在寄存器末字节中
    CRC8 = CRC8^tabdata;          //将寄存器与查出的值进行异或运算 t = (CRC8>>4) & 0x0F;         //要移出的半字节的值
    tabdata = CRC_8_tab[t];       //根据移出的半字节的值查表
    CRC8 = (CRC8<<4) | (c&0x0F);  //将新移进来的低位半字节值添在寄存器末字节中
    CRC8 = CRC8^tabdata;          //将寄存器与查出的值进行异或运算
    datanum++;                    //下一个字节
    }
      

  2.   

    CRC8Generator(BYTE *DataBuf, unsigned long len)
      

  3.   

    loves123(),兄弟,我没有那张CRC表啊,郁闷,你能发个CRC文件给我吗?
    [email protected]
      

  4.   

    BYTE CRC_8_tab[16] =                     //参数表
    {
    0x00,0x07,0x0e,0x09,
    0x1c,0x1b,0x12,0x15,
    0x38,0x3f,0x36,0x31,
    0x24,0x23,0x2a,0x2d,
    };
      

  5.   

    BYTE CRC8Generator(BYTE *DataBuf, unsigned long len)
    {
    BYTE CRC8;
    BYTE tabdata;
    unsigned int datanum;
    BYTE c,t;
    CRC8 = 0x00;                        //初值为0
    datanum = 0;
    while(len--)                      //每次循环处理一个字节
    {
    c = DataBuf[datanum];         //新移进来的字节值 t = (CRC8>>4) & 0x0F;         //要移出的半字节的值
    tabdata = CRC_8_tab[t];       //根据移出的半字节的值查表
    CRC8 = (CRC8<<4) | c>>4;      //将新移进来的高位半字节值添在寄存器末字节中
    CRC8 = CRC8^tabdata;          //将寄存器与查出的值进行异或运算 t = (CRC8>>4) & 0x0F;         //要移出的半字节的值
    tabdata = CRC_8_tab[t];       //根据移出的半字节的值查表
    CRC8 = (CRC8<<4) | (c&0x0F);  //将新移进来的低位半字节值添在寄存器末字节中
    CRC8 = CRC8^tabdata;          //将寄存器与查出的值进行异或运算
    datanum++;                    //下一个字节
    }
    return CRC8;}这个就是了,我现在用的就是这种,CRC表就用上面那个就可以了。
      

  6.   

    兄弟,谢谢!现在CSDN上人气太差了,codeproject,codeguru还是牛啊