69,371
社区成员
发帖
与我相关
我的任务
分享
/***** crc16.c *****/
#include <stdio.h>
#define CRC16_DNP 0x3D65u // DNP, IEC 870, M-BUS, wM-BUS, ...
#define CRC16_CCITT 0x1021u // X.25, V.41, HDLC FCS, Bluetooth, ...
//Other polynoms not tested
#define CRC16_IBM 0x8005u // ModBus, USB, Bisync, CRC-16, CRC-16-ANSI, ...
#define CRC16_T10_DIF 0x8BB7u // SCSI DIF
#define CRC16_DECT 0x0589u // Cordeless Telephones
#define CRC16_ARINC 0xA02Bu // ACARS Aplications
#define POLYNOM CRC16_DNP // Define the used polynom from one of the aboves
// Calculates the new crc16 with the newByte. Variable crcValue is the actual or initial value (0).
unsigned short crc16(unsigned short crcValue, unsigned char newByte) {
int i;
for (i = 0; i < 8; i++) {
if (((crcValue & 0x8000u) >> 8) ^ (newByte & 0x80u)){
crcValue = (crcValue << 1) ^ POLYNOM;
} else {
crcValue = (crcValue << 1);
}
newByte <<= 1;
}
return crcValue;
}
unsigned short exampleOfUseCRC16(unsigned char *Data, int len){
unsigned short crc;
int aux = 0;
crc = 0x0000u; //Initialization of crc to 0x0000 for DNP
//crc = 0xFFFFu; //Initialization of crc to 0xFFFF for CCITT
while (aux < len){
crc = crc16(crc,Data[aux]);
aux++;
}
return (~crc); //The crc value for DNP it is obtained by NOT operation
//return crc; //The crc value for CCITT
}
int main() {
unsigned char d[10]={0,1,2,3,4,5,6,7,8,9};
printf("0x%04hX\n",exampleOfUseCRC16(d,10));//0x1078
return 0;
}