非多项式CRC16校验算法

来源:互联网 发布:linux下源码安装mysql 编辑:程序博客网 时间:2024/06/05 10:29

用C语言实现非多项式CRC16校验算法,易于移植:

#define CRC_PRESET      0xffff#define CRC_POLYNOM     0xa001//电量CRC16的多项式#define CRC_SPOLYNOM    0x8408//基站的多项式,最后使用基站CRC校验码#define CRCGEN          0x1021//CRC16的多项式/********************************************************************************函数名称:calculate_crc16*入口参数:数据长度,数据头指针*出口参数:返回16位的校验值*功能说明:可以对数组范围内前任意长度的数据进行校验********************************************************************************/u16 calculate_crc16( volatile u8 *checksource, u8 length){       unsigned char verifyi,verifyj;unsigned short verifynum = CRC_PRESET; for (verifyi=0;verifyi<length;verifyi++)  {    verifynum^=*checksource;    for (verifyj=0;verifyj<8;verifyj++)    {      if (verifynum&0x0001)        verifynum=(verifynum>>1)^CRC_SPOLYNOM;//CRC多项式      else      verifynum=(verifynum>>1) ;    }    checksource++;  }  return verifynum;}/********************************************************************************函数名称:calculate_crc16*入口参数:数据长度,数据头指针*出口参数:返回16位的校验值*功能说明:针对区控协议(最后2个byte为crc值)的一个校验,length为数据包总长度*******************************************************************************/bool check_crc(volatile u8 *checksource,u8 length)  {   u16 pri_crc,calcu_crc;      pri_crc = ((u16)(checksource[length-2])<<8) +(u16)(checksource[length-1]);   calcu_crc= calculate_crc16(checksource,length-2);       if(pri_crc ==calcu_crc)        return true;    else         return false;}//调用examplevoid add_device(){ bool crc16_res;  volatile u8  add_cmd1[10] = {0x02,0x00,0x04/*RSIIU_ID*/,0xc7,0x03/* data length*/,\ 0x05/*port*/,0x10,0x11/*id*/,0x94,0x0d}; volatile u8   add_cmd2[18] = {0x02,0x00,0x04/*RSIIU_ID*/,0xc8,0x0b/*data length*/,\                         0x00/*type*/,0x06/*port*/,0x10,0x11,0x01,0xc2,0x00/*baud*/,\                         0xc0,0xa8,0x00,0x64/*ip*/,0x38,0xd8}; crc16_res = check_crc(add_cmd1,10);   fprintf(cgiOut, "<p> %x \n",crc16_res);  crc16_res = check_crc(add_cmd2,18);   fprintf(cgiOut, "<p> %x \n",crc16_res); }</span>



0 0