uint16_t verify_crc16(unsigned char *chData,unsigned short uNo) { uint16_t crc=0xffff; uint16_t i,j; for(i=0;i<uNo;i++) { crc^=chData[i]; for(j=0;j<8;j++) { if(crc&1) { crc>>=1; crc^=0xA001; } else crc>>=1; } } return (crc); } /*********************************************************************************** * crc16校验值,分布校验,把校验值带入计算 * ***************************************************************************************/ uint16_t verify_crc16_continue(uint16_t crc,unsigned char *chData,unsigned short uNo) { //uint16_t crc=0xffff; uint16_t i,j; for(i=0;i<uNo;i++) { crc^=chData[i]; for(j=0;j<8;j++) { if(crc&1) { crc>>=1; crc^=0xA001; } else crc>>=1; } } return (crc); } uint16_t verify_crc16_uint32(uint16_t crc,uint32_t *chData,uint32_t uNo) { //uint16_t crc=0xffff; uint8_t array[4]; uint32_t i,j,k; for(i=0;i<uNo;i++) { memcpy(array,&chData[i],4); for(k=0;k<4;k++) { crc^=array[k]; for(j=0;j<8;j++) { if(crc&1) { crc>>=1; crc^=0xA001; } else crc>>=1; } } } return (crc); }
时间: 2023-08-01 08:13:41 浏览: 132
这段代码是关于 CRC16 校验的实现。它定义了三个函数:verify_crc16、verify_crc16_continue和verify_crc16_uint32。
- verify_crc16函数用于计算CRC16校验值。它接收一个unsigned char类型的数据指针chData和一个unsigned short类型的数据长度uNo作为参数。首先,它初始化crc为0xffff,然后对每个数据字节进行异或操作,并进行8次循环迭代,根据位运算和条件判断,更新crc的值。最后将crc作为校验结果返回。
- verify_crc16_continue函数与verify_crc16函数类似,区别在于它接收一个额外的crc参数,用于从上一次计算的结果开始继续计算CRC16校验值。
- verify_crc16_uint32函数用于计算32位数据的CRC16校验值。它接收一个uint32_t类型的数据指针chData和一个uint32_t类型的数据长度uNo作为参数。首先,它将每个uint32_t数据拆分成4个字节,并使用memcpy函数将其存储在array数组中。然后,对每个字节进行异或操作,并进行8次循环迭代,根据位运算和条件判断,更新crc的值。最后将crc作为校验结果返回。
这些函数使用了CRC16算法中的多项式0xA001进行计算。
相关问题
将uint16_t crc16_modbus_8005(unsigned char *buf, unsigned int len) { uint16_t crc16 = crc16_modbus_a001(buf, len); return ((crc16 & 0x00ff) << 8) | ((crc16 & 0xff00) >> 8); //high-low convert } uint16_t crc16_modbus_a001(unsigned char *buf, unsigned int len) { uint16_t crc16 = 0xffff; uint16_t tmp; int i, j; for (j=0; j<len; j++) { crc16 = buf[j] ^ crc16; for (i=0; i<8; i++) { tmp = crc16 & 0x0001; crc16 = crc16 >> 1; if (tmp) crc16 = crc16 ^ 0xa001; } } return crc16; }这段程序改写成MK22FN512VLH12单片机使用官方库的fsl_crc.h文件中
以下是使用fsl_crc.h文件中的CRC模块实现的代码:
```c
#include "fsl_crc.h"
uint16_t crc16_modbus_8005(unsigned char *buf, unsigned int len)
{
crc_config_t config;
uint16_t crc16;
/* 初始化CRC模块配置 */
CRC_GetDefaultConfig(&config);
config.polynomial = 0xA001;
config.seed = 0xFFFF;
config.reflectIn = true;
config.reflectOut = true;
/* 计算CRC16 */
CRC_Init(CRC0, &config);
CRC_WriteData(CRC0, buf, len);
crc16 = CRC_Get16bitResult(CRC0);
/* 高低位转换 */
return ((crc16 & 0x00ff) << 8) | ((crc16 & 0xff00) >> 8);
}
```
需要注意的是,该代码中使用了CRC模块的反射输入和反射输出功能,因为Modbus协议中使用的CRC算法是反向的。同时,CRC模块的多项式和种子值也需要设置为对应的值。
uint8_t system_packet_verify(unsigned char *packet,int len) { int index; uint8_t verify; verify = 0; for(index=1;index<len;index++) { verify = verify + packet[index]; } return verify; } /********************************************************************* * 和校验 * ************************************************************************/ uint8_t verify_summer(uint8_t *pBuffer,uint16_t len) { uint8_t verify; uint16_t index; verify=0; for(index=0;index<len;index++) { verify += pBuffer[index]; } return verify; } /********************************************************************** * 交换16bit数据的高低字节 * ***********************************************************************/ uint16_t verify_swap(uint16_t verify) { uint16_t verify_crc; verify_crc = ((verify&0xff)<<8) + ((verify>>8)&0xff); return verify_crc; } uint16_t verify1,verify2;
这段代码包含了几个函数和两个变量。
1. system_packet_verify函数用于计算给定数据包packet的和校验值。它接收一个unsigned char类型的数据包指针packet和数据包长度len作为参数。首先,它初始化verify为0,然后对除第一个字节之外的所有字节进行累加操作,并将结果存储在verify变量中。最后,它将verify作为校验结果返回。
2. verify_summer函数用于计算给定缓冲区pBuffer的和校验值。它接收一个uint8_t类型的缓冲区指针pBuffer和缓冲区长度len作为参数。首先,它初始化verify为0,然后对所有字节进行累加操作,并将结果存储在verify变量中。最后,它将verify作为校验结果返回。
3. verify_swap函数用于交换给定16位数据verify的高低字节。它接收一个uint16_t类型的数据verify作为参数。首先,它通过位运算将高低字节交换位置,并将结果存储在verify_crc变量中。最后,它将verify_crc作为交换后的结果返回。
4. verify1和verify2是两个uint16_t类型的变量,可能用于存储计算得到的校验值。
这些函数主要用于数据包校验和操作,以及高低字节的转换。
阅读全文
相关推荐















