单片机CRC源码
1 /****************************************************************************************** 2 * 函数功能:CRC校验用函数 3 * 函数输入:puchMsgg是要进行CRC校验的消息,usDataLen是消息中字节数 4 * 函数输出:计算出来的CRC校验码。 5 ****************************************************************8*************************/ 6 uint16_t CRC16(uint8_t *puchMsgg,uint8_t usDataLen)//puchMsgg是要进行CRC校验的消息,usDataLen是消息中字节数 7 { 8 uint8_t uchCRCHi = 0xFF ; /* 高CRC字节初始化*/ 9 uint8_t uchCRCLo = 0xFF ; /* 低CRC 字节初始化*/ 10 uint8_t uIndex ; /* CRC循环中的索引*/ 11 while (usDataLen--) /* 传输消息缓冲区*/ 12 { 13 uIndex = uchCRCHi ^ *puchMsgg++ ; /* 计算CRC */ 14 uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ; 15 uchCRCLo = auchCRCLo[uIndex] ; 16 } 17 return ((uchCRCHi<< 8) | uchCRCLo) ; 18 }
用法举例:
1 void MessageHandle(uint8_t *pointer_in,uint8_t *pointer_out) 2 { 3 CalKey = CRC16(pointer_in+1,*pointer_in-2); //对接收到的命令进行CRC校验,得到新的校验码 4 //写入校验码 5 SendKey = CRC16(Pointer_out+1,3); 6 //将计算出来的校验码装入输出数据缓存中 7 *(Pointer_out+4) = (uint8_t)(SendKey>>8); 8 *(Pointer_out+5) = (uint8_t)(SendKey&0x00FF); 9 }
用法中,对于发送帧,是先放CRC高位,后放CRC低位,但在标准ModBus中,先放CRC低位,后放CRC高位。