kopia lustrzana https://github.com/mikaelnousiainen/RS41ng
33 wiersze
860 B
C
33 wiersze
860 B
C
#include "crc.h"
|
|
|
|
uint16_t calc_crc(uint8_t *data, size_t length);
|
|
|
|
size_t cats_append_crc(uint8_t *data, size_t len)
|
|
{
|
|
uint16_t crc = calc_crc(data, len);
|
|
data[len++] = crc;
|
|
data[len++] = crc >> 8;
|
|
|
|
return len;
|
|
}
|
|
|
|
// https://stackoverflow.com/questions/69850602/converting-c-to-java-for-crc16-ibm-sdlc
|
|
uint16_t calc_crc(uint8_t *data, size_t length)
|
|
{
|
|
uint8_t *ptr = data;
|
|
uint8_t crcbyte1 = 0xFF;
|
|
uint8_t crcbyte2 = 0xFF;
|
|
for (int i = 0; i < length; i++) {
|
|
uint8_t r1 = *ptr++ ^ crcbyte2;
|
|
r1 = (r1 << 4) ^ r1;
|
|
crcbyte2 = (r1 << 4) | (r1 >> 4);
|
|
crcbyte2 = (crcbyte2 & 0x0F ) ^ crcbyte1;
|
|
crcbyte1 = r1;
|
|
r1 = (r1 << 3) | (r1 >> 5);
|
|
crcbyte2 = crcbyte2 ^ (r1 & 0xF8);
|
|
crcbyte1 = crcbyte1 ^ (r1 & 0x07);
|
|
}
|
|
|
|
return ~((crcbyte1 << 8) | crcbyte2);
|
|
}
|