📄 crc16.c
字号:
#include "typedef.h"
#include "crc16.h"
#define POLYNOMIAL 0x8408 /*x^16+x^12+x^5+1*/
#define PRESET_VALUE 0xFFFF
#define CHECK_VALUE 0xF0B8
#define CALC_CRC 1
#define CHECK_CRC 0
uchar code tab1[16]={0x00,0x08,0x04,0x0c,0x02,0x0a,0x06,0x0e ,0x01,0x09,0x05,0x0d,0x03,0x0b,0x07,0x0f};
WORD crc16Calculate(BYTE idata * pBuf,BYTE byLen)
{
unsigned int current_crc_value;
BYTE i,j;
current_crc_value = PRESET_VALUE;
for(i=0;i<byLen;i++)
{
current_crc_value = current_crc_value^pBuf[i];
for(j=0;j<8;j++)
{
if(current_crc_value & 0x0001)
{
current_crc_value = (current_crc_value>>1)^POLYNOMIAL;
}
else
{
current_crc_value = (current_crc_value>>1);
}
}
}
current_crc_value = ~current_crc_value; //?????
return(current_crc_value);
}
/******************************************************/
bit chkCRC(BYTE idata * cBuf,BYTE cLen)
{
bit flag =1;
uchar i;
uint j;
for(i=0;i<cLen;i++) { cBuf[i] = ReflectBYTE(cBuf[i]); }
j = crc16Calculate(cBuf,cLen-2);
flag = (cBuf[cLen-2] == LOBYTE(j) ); //crc LSByte
flag &= (cBuf[cLen-1] == HIBYTE(j) ); //crc MSByte
return(flag);
}
/*
bit chkCRC_re(BYTE idata * cBuf,BYTE cLen)
{
bit flag=1 ;
uint j;
j = ~ crc16Calculate(cBuf,cLen-2);
flag = (cBuf[cLen-2] == LOBYTE(j) ); //crc MSByte
flag &= (cBuf[cLen-1] == HIBYTE(j) ); //crc LSByte
return(flag);
}
*/
BYTE ReflectBYTE(BYTE byOrg)
{
BYTE j,k;
j = byOrg & 0x0f;
j = tab1[j];
j = j<<4;
k = byOrg>>4;
k = tab1[k];
j = j + k;
return(j);
}
/******************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -