niba 发表于 2016-9-28 13:19:23

Modbus crc16 纯计算校验谁有呀?不要查表的,空间不够了!

Modbus crc16 纯计算校验谁有呀?不要查表的,空间不够了!计算慢点不要紧,网上转了一圈都是 查表的。

ddddd120 发表于 2016-9-28 13:45:11

uint16 GetCrc16(UCHAR *pucBuffer,uint16 wDataLength)
{
    UCHAR ucHigh,ucLow,ucCrc16H,ucCrc16L;
    UCHAR ucSaveH,ucSaveL;
    int ii,ij;
    ucCrc16H=0xFF;
    ucCrc16L=0xFF;
    ucLow=0x1;
    ucHigh=0xA0;
    for (ii=0;ii<wDataLength;ii++)
    {
       ucCrc16L=(ucCrc16L ^ pucBuffer);
       for (ij=0;ij<8;ij++)
       {
         ucSaveH=ucCrc16H;
         ucSaveL=ucCrc16L;
         ucCrc16H=(ucCrc16H>>1);
         ucCrc16L=(ucCrc16L>>1);
         if ((ucSaveH & 0x01)==0x01)
         {
            ucCrc16L=(ucCrc16L | 0x80);
         }
         if ((ucSaveL & 0x01)==0x01)
         {
            ucCrc16H = (ucCrc16H ^ ucHigh);
            ucCrc16L = (ucCrc16L ^ ucLow);
         }         
       }
    }

   

   return(ucCrc16L + (ucCrc16H<<8)) ;


}

jianplx 发表于 2016-9-28 15:09:44

ddddd120 发表于 2016-9-28 13:45
uint16 GetCrc16(UCHAR *pucBuffer,uint16 wDataLength)
{
    UCHAR ucHigh,ucLow,ucCrc16H,ucCrc16L;


谢谢                     

desertsailor 发表于 2016-10-9 22:31:17

查表也有很多种的,可以只查4位crc的表格,再加适量的运算

MyOS 发表于 2016-10-10 08:24:09

可以用半字节的查表呀,应该是最省空间和计算时间的方法
页: [1]
查看完整版本: Modbus crc16 纯计算校验谁有呀?不要查表的,空间不够了!