Ich versuche, eine CRC16-Fehlererkennung zu einer Motorola HCS08-Mikrocontroller-Anwendung hinzuzufügen. Meine Prüfsummen stimmen jedoch nicht überein. Ein Online-CRC-Rechner liefert sowohl das Ergebnis, das ich in meinem PC-Programm sehe, als auch das Ergebnis, das ich sehe das Mikro.
Es ruft das Mikroergebnis "XModem" und das PC-Ergebnis "Kermit" auf.
Was ist der Unterschied zwischen der Art, wie diese beiden alten Protokolle die Verwendung von CRC16 spezifizieren?
Sie können 16 Bit IBM, CCITT, XModem, Kermit und CCITT 1D0F mit der gleichen Basiscode-Basis implementieren. siehe Ссылка , das Code von Ссылка
Die folgende Tabelle zeigt, wie sie sich unterscheiden:
%Vor%wobei "reverse byte" bedeutet, dass jedes Byte vor der Verarbeitung umgekehrt wird; "umgekehrtes Ergebnis" bedeutet, dass das 16-Bit-Ergebnis nach der Verarbeitung umgekehrt wird; 'swap result' bedeutet, dass die zwei Bytes im Ergebnis nach der Verarbeitung getauscht werden.
all das wurde mit Testvektoren gegen Ссылка validiert (wenn das falsch ist, wir sind alle verloren ...).
In Ihrem speziellen Fall können Sie also Code für XModem in Kermit umwandeln, indem Sie jedes Byte bitweise umkehren, das Ergebnis umkehren und dann die zwei Bytes im Ergebnis vertauschen.
[ich glaube, aber habe die Details nicht überprüft oder ausgearbeitet, dass die Umkehrung jedes Bytes der Umkehrung des Polynoms (plus ein paar zusätzlichen Details) entspricht. Aus diesem Grund werden Sie an verschiedenen Stellen sehr unterschiedliche Erklärungen für den im Grunde gleichen Algorithmus sehen.
Auch ist der obige Ansatz nicht effizient, aber gut zum Testen. Wenn Sie effizient arbeiten möchten, übersetzen Sie das Obige in Nachschlagetabellen.]
edit Was ich oben CCITT genannt habe, ist im RevEng-Katalog als CCITT dokumentiert -FALSCH. Weitere Informationen finden Sie im Update zu meinem Blogpost unter dem obigen Link.
Meine Erinnerung (ich habe früher immer gesagt, dass es Modem-Sachen gibt) ist, dass Kermit die Bits in jedem Byte der Daten mit dem niedrigstwertigen Bit zuerst verarbeitet.
Die meisten Software-CRC-Implementierungen (wahrscheinlich Xmodem) durchlaufen zuerst das höchstwertige Bit der Datenbytes.
Wenn Sie sich die Bibliotheksquelle ansehen (laden Sie sie von Ссылка herunter), verwenden Sie diese für die CRC-Berechnungsseite Verknüpft mit, Sie werden sehen, dass XModem CRC16-CCITT verwendet, das Polynom für das ist:
%Vor%Das Polynom wird durch die Bitmap dargestellt (beachten Sie, dass Bit 16 impliziert ist)
%Vor%Die Kermit-Implementierung verwendet:
%Vor%ist die gleiche Bitmap wie XModems, nur umgekehrt.
Die Textdatei, die die Bibliothek begleitet, erwähnt auch den folgenden Unterschied für Kermit:
Nur für CRC-Kermit und CRC-SICK: Nach jeder Eingabeverarbeitung wird das Einerkomplement der CRC berechnet und die zwei Bytes der CRC werden vertauscht.
Es sollte also leicht möglich sein, Ihre CRC-Routine so anzupassen, dass sie dem PC-Ergebnis entspricht. Beachten Sie, dass die Quelle in der CRC-Bibliothek eine recht liberale Lizenz zu haben scheint - es könnte sinnvoll sein, sie mehr oder weniger zu verwenden (zumindest die Teile, die für Ihre Anwendung gelten).
Tags und Links microcontroller checksum crc crc16