10 cyclical redundancy checksum (crc), Algorithm, Commands – Watlow Series 988 Family User Manual
Page 28

4.10
Data Communications with the Watlow Series 988 Family
Sending Commands, Chapter 4
NOTE:
When the CRC is
added to the
message packet
be sure to put the
low byte before
the high byte.
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;
/* Intitialize CRC */
crc = 0xffff;
/* Loop through the entire packet */
do{
/* Exlusive-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 poynomial 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);
}
Commands