10
char LegacyChecksum(char * Response)
{
int length, sum = 0, i, crc;
// Finding the length of the response string
length = strlen(Response);
// Adding characters in the response together
for( i = 0; i < length; i++ ){
sum += Response[i];
}
// Converting checksum to a printable character
crc = sum % 64 + 32;
return crc;
}
The more robust CRC6, if available, utilizes the CRC-6-CDMA2000-A polynomial with the value 48 added to the
results to make this a printable character and is computed from the start of the transmission to the legacy
checksum character.
CRC6 checksum example input is <TAB>-34.8 22.3<CR>k@ and the resulting checksum output is l (lowercase L).
uint8_t CRC6_Offset(uint8_t *buffer, uint16_t bytes)
{
uint16_t byte;
uint8_t bit;
uint8_t crc = 0xfc; // Set upper 6 bits to 1’s
// Loop through all the bytes in the buffer
for(byte = 0; byte < bytes; byte++)
{
// Get the next byte in the buffer and XOR it with the crc
crc ^= buffer[byte];
// Loop through all the bits in the current byte
for(bit = 8; bit > 0; bit--)
{
// If the uppermost bit is a 1...
if(crc & 0x80)
{
// Shift to the next bit and XOR it with a polynomial
crc = (crc << 1) ^ 0x9c;
}
else
{
// Shift to the next bit
crc = crc << 1;
}
}
}
// Shift upper 6 bits down for crc
crc = (crc >> 2);
// Add 48 to shift crc to printable character avoiding \r \n and !
return (crc + 48);
}