Crc-16 calculation example in c – Yaskawa G7 Modbus Communication User Manual
Page 31

31
CRC-16 Calculation Example in C
void
getMBCRC(char
*,
int,
char
*)
//
function
prototype
void getMBCRC(char *buf, int bufLen, char *crc) {
// Function name and parameter list returning a void
// *buf
pointer to character array used to calculate CRC
//
bufLen
number
of
characters
to
calculate
CRC
for
//
*crc
pointer
to
the
array
that
contains
the
calculated
CRC
unsigned long crc_0 = 0xffff;
//
Declare
and
initialize
variables
unsigned long crc_1 = 0x0000;
// Declare and initialize variables
int
i,j;
//
Declare
and
initialize
variables
for (i=0; i // Loop through characters of input array crc_0 ^= ((unsigned long)buf[i] & 0x00ff); // XOR current character with 0x00ff for (j=0;j<8;j++) { // Loop through characters bits crc_1 = (crc_0 >> 1) & 0x7fff; // shift result right one place and store if (crc_0 & 0x0001) // if pre-shifted value bit 0 is set crc_0 = (crc_1 ^ 0xa001); // XOR the shifted value with 0xa001 else // if pre-shifted value bit 0 is not set crc_0 = crc_1; // set the pre-shifted value equal to the shifted value } // End for loop - Loop through characters bits } // End for loop - Loop through characters of input array crc[0] = (unsigned char)((crc_0/256) & 0x00ff); // Hi byte crc[1] = (unsigned char)(crc_0 & 0x00ff); // Lo byte return; // Return to calling function } // End of CRC calculation function