To ensure message data integrity, it is advisable to implement code that checks for serial port (UART) framing errors in addition to the verifying the message CRC. If the CRC in the received message does not match the CRC calculated by the receiving device, the message should be ignored. The C language code snippet below shows how to compute the Modbus message CRC using bit-wise shift and exclusive OR operations. The CRC is computed using every byte in the message frame except for the last two bytes which comprise the CRC itself.
// Compute the MODBUS RTU CRC
UInt16 ModRTU_CRC(byte[] buf, int len)
{
UInt16 crc = 0xFFFF;
for (int pos = 0; pos < len; pos++) {
crc ^= (UInt16)buf[pos]; // XOR byte into least sig. byte of crc
for (int i = 8; i != 0; i--) { // Loop over each bit
if ((crc & 0x0001) != 0) { // If the LSB is set
crc >>= 1; // Shift right and XOR 0xA001
crc ^= 0xA001;
}
else // Else LSB is not set
crc >>= 1; // Just shift right
}
}
// Note, this number has low and high bytes swapped, so use it accordingly (or swap bytes)
return crc;
}
Keywords:
check sum
