Cyclical redundancy checksum (crc) algorithm, Appendix – Watlow MICRODIN User Manual

Page 93

Advertising
background image

Cyclical Redundancy Checksum (CRC) Algorithm

This C routine, calc_crc(), calculates the cyclical redundancy checksum, CRC,
for a string of characters. The CRC is the result of dividing the string by
0xA001. Modbus applications calculate the packet’s CRC then append it to the
packet.

#define POLYNOMIAL 0xA001;

unsigned int calc_crc(unsigned char *start_of_packet, unsigned char
*end_of_packet)
{

unsigned int crc;
unsigned char bit_count;
unsigned char *char_ptr;

/* Start at the beginning of the packet */

char_ptr = start_of_packet;

/* Initialize CRC */

crc = 0xffff;

/* Loop through the entire packet */

do{

/* Exclusive-OR the byte with the CRC */

crc ^= (unsigned int)*char_ptr;

/* Loop through all 8 data bits */

bit_count = 0;
do{

/* If the LSB is 1, shift the CRC and XOR the polynomial mask with the CRC */

if(crc & 0x0001){

crc >>= 1;
crc ^= POLYNOMIAL;

}

/* If the LSB is 0, shift the CRC only */

else{

crc >>= 1;

}

} while(bit_count++ < 7);

} while(char_ptr++ < end_of_packet);

return(crc);

}

Wa t l o w M i c r o D I N A . 7

Appendix

Advertising