本算法主要用于通讯数据传输中的数据校验,比如在基于串口的用户协议中,保证通讯的健壮性,就需要加入简单的校验,防止错报或者部分数据丢失。
主要原理为:发送数据时,在原始数据的末尾加入一个字节,用于存储原始数据的求和的值,当和值大于255时,对255取余。
数据接收时,计算一包数据除末位之外的和值,对比末尾位数据,以校验数据正确性
/***********************************************************************************************
*函数名 : sumCrc
*函数功能描述 : 数组求和
*函数参数 : data,待求和数组;len,数组长度
*函数返回值 : 求和值
*作者 :layne
***********************************************************************************************/
unsigned char sumCrc(unsigned char *data, unsigned short len)
{
unsigned short i = 0;
unsigned char sum = 0;
for(i=0; i < len; i++){
sum += data[i];
}
return sum&0xff;
}
/***********************************************************************************************
*函数名 : sumCrc
*函数功能描述 : 数组和校验
*函数参数 : data,待校验数组,最后一位为待校验和值;len,数组长度
*函数返回值 : 求和值
*作者 :layne
***********************************************************************************************/
bool checkCrc(unsigned char *data, unsigned short len)
{
int i = 0;
unsigned char sum = 0;
for(i=0;i<len-1;i++){
sum += data[i];
}
if(sum != data[len-1])
return TRUE;
return FALSE;
}
/***********************************************************************************************
*函数名 : test_func
*函数功能描述 : 测试函数
*函数参数 :
*函数返回值 :
*作者 :layne
***********************************************************************************************/
void test_func(void)
{
bool result;
unsigned char sum;
unsigned char data[] = {0xff, 0x01, 0x00, 0x33, 0x34, 0x68};
sum = sumCrc(data,sizeof(data)-1);//sum == 0x68 ?
printf("sum = %d\n",sum);
result = checkCrc(data, sizeof(data));
printf("result = %d\n",result);
}