📄 crc16.c
字号:
/******************************************************************************
** 函数: cal_crc
** 入参: unsigned char *ptr, unsigned char len
** 返回: unsigned int crc
** 作者: jerkoh
** 说明:CRC16-CCITT x16+x12+x5+1 1021 初始crc=0; crc=0xffff
CRC寄存器组初始化为全"0"(0x0000)。
注意:CRC寄存器组初始化全为1时,最后CRC应取反
******************************************************************************/
#include "global.h"
unsigned int cal_crc(unsigned char *ptr, unsigned char len)
{
unsigned char i;
unsigned int crc=0xffff;
while(len--!=0)
{
for(i=0x80;i!=0;i/=2) /*8字节*/
{
if((crc&0x8000)!=0)
{
crc*=2;
crc^=0x1021; /*左移异或CRC*/
}
else
{
crc*=2;
}
if((*ptr&i)!=0) crc^=0x1021;
}
ptr++;
}
return(crc);
}
/******************************************************************************
** 函数: cksum()
** 入参: rxdata
** 返回: sum
** 说明:
******************************************************************************/
UINT cksum(UCHAR xdata *check,UINT length) //计算校验和
{
LONG sum=0;
UINT i;
UINT xdata *ptr;
ptr=(UINT xdata *)check;
for (i=0;i<(length)/2;i++)
{
sum+=*ptr++;
}
if (length&0x01)//表示长度为单数
{
sum=sum+((*ptr)&0xff00);
}
sum=(sum&0xffff)+((sum>>16)&0xffff); //高16位和低16位相加
if(sum&0xffff0000)
{//表示有进位
sum++;
}
return ( (UINT)((sum)&0xffff));
// return ( (UINT)(~((sum)&0xffff)));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -