Folgendes: Ich muss eine bestimmte Bitfolge seriell "über Funk" übertragen. Im Rahmen einer Kollisionsbehandlung, die vom Hersteller vorgegeben ist. Ich bekomme eine Nummer von einem Device zugeschickt. Wenn mehrere Devices durcheinander senden, muss ich eine Sequenz senden aus Position der Kollision (5 bit), die bis dahin gelesene Nummer (plus 1 oder 0 an der Kollisionsposition) und nen 8-bit CRC. Mein Testcase sieht jetzt so aus, dass an Position 6 eine Kollision auftritt. Die Nummer vom Device ist 000010011usw. Ich kann 00001 sauber lesen und danach kommt die Kollision. Also muss ich "00110000010" plus crc senden.
Im Handbuch steht: Generatorpolynom ist x^8+x^4+x^3+x^2+1 = 0x1D und pre-set-value ist 0xFF. bitreihenfolge ist msb...lsb
Und jetzt geht der ganze Spaß nämlich los. Es ist ein Beispielcode dabei:
Spoiler:(zum lesen bitte Text markieren)Code:#include <stdio.h> #define CRC_PRESET 0xFF #define CRC_POLYNOM 0x1D void calc_crc(unsigned char * crc, unsigned char data, unsigned char Bitcount) { *crc ^= data; // crc = crc (exor) data do { if( *crc & 0x80 ) // if (MSB-CRC == 1) { *crc<<=1; // CRC = CRC Bit-shift left *crc ^= CRC_POLYNOM; // CRC = CRC (exor) CRC_POLYNOM } else { *crc<<=1; // CRC = CRC Bit-shift left } printf("CRC: %02X ", *crc); } while(--Bitcount); printf("\n"); } // output result step by step void main(void) { const cmd=0x00; /* 5 Bit command, aligned to MSB */ const ident[4]={0x2C, 0x68, 0x0D, 0xB4 }; unsigned char crc; int i; crc = CRC_PRESET; /* initialize crc algorithm */ calc_crc(&crc, cmd, 5); /* compute 5 crc Bits only */ for(i=0; i<4; i++) calc_crc(&crc, ident[i], 8); /* crc = 0x9E at this point */ printf("%02X\n",crc); getch(); }
Jetzt bin ich mir nicht sicher, ob ich meine Bitfolge komplett in diese Funktion reingeben soll, oder erst nur die ersten 5 Bit und dann die 6 Bit oder wie auch immer. Aber egal, was ich auch mache, ich komme mit diesem Programm nicht auf das selbe Ergebnis wie mit diesem Onlinerechner, den ich mir zur Verifizierung mal angeschaut habe: http://www.zorc.breitbandkatze.de/crc.html
Da hab ich auch schon sämtliche Optionen durchprobiert. Die meisten Lösungen habe ich auch schon an meiner Sendeeinheit ausprobiert, aber erfolglos. Vom Device kommt nichts zurück. Ich bin jetzt kurz davor, einfach diese letzten 8 Bit zu bruteforcen um mir dann irgendeinen Algorithmus zu basteln, der mir dann das ergebnis berechnet. Vorher möchte ich aber hier nochmal nachfragen, ob jemand ne Idee hat.