Sie links im Dokument einen wichtigen Bestandteil des Beispiels aus, die, dass der UAP im Beispiel wird 0x47
verwendet wird. Der CRC muss mit dem UAP initialisiert werden. (Seltsamerweise mit den umgekehrten Bits und in dem hohen Byte relativ zu den hereinkommenden Datenbits.)
Der folgende Code berechnet das Beispiel. Das Ergebnis ist d26d
. Der CRC wird zuerst als niedrigstwertiges Bit gesendet, daher wird er gesendet 6d d2
. Auf der Empfangsseite wird die gleiche CRC für die gesamte Sache mit der CRC berechnet, und das Ergebnis ist Null, wobei die Empfangsseite prüfen soll, was gesendet wurde.
#include <stdio.h>
static unsigned crc_blue(unsigned char *payload, size_t len) {
unsigned crc = 0xe200; // UAP == 0x47
while (len--) {
crc ^= *payload++;
for (int k = 0; k < 8; k++)
crc = crc & 1 ? (crc >> 1)^0x8408 : crc >> 1;
}
return crc;
}
int main(void) {
unsigned char payload[] = {
0x4e, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09};
printf("%04x\n", crc_blue(payload, sizeof(payload)));
unsigned char recvd[] = {
0x4e, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x6d, 0xd2};
printf("%04x\n", crc_blue(recvd, sizeof(recvd)));
return 0;
}
Ihr Code müsste das UAP für dieses Gerät entsprechend initialisieren.
Um, Syntaxfehler, nicht benötigte Anweisungen, fehlende POLY-Definition, falsche Initialisierung ..., offensichtlich nicht getestet. –