mikrocontroller.net

Forum: PC-Programmierung [S] Hilfe CRC(16?) -> So verbreitet und doch zu schwer für mich.


Autor: Michael B. (planlessmichi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

es ist soweit: Ich zweifle langsam an meinem Verstand. Zugegeben, bisher 
habe ich mit CRC-Berechnungen noch nicht viel zu tun gehabt, aber ich 
habe heute bereits den zweiten Tag damit verbracht und kapier das 
einfach nicht.

Kurzes (obligatorisches) Vorwort: Selbstverständlich habe ich google 
etc. ausgiebig benutzt, sogar mit Freuden gesehen, dass es hier einen 
eigenen Artikel über CRC-Berechnungen gibt, aber ich kann meine 
Daten nicht nachvollziehen. Sämtliche Online-Rechner und Codebeispiele 
liefern mir andere Ergebnisse.

Hintergrund: Ich habe ein Messgerät, dass mir über eine serielle 
Verbindung Daten schickt. Diese Daten sehen wie folgt aus (Zitat aus dem 
zugehörigen Manual):

>Datenformat:
>Ein Datenblock umfasst 12 Bytes, davon 10 Datenbytes und zwei CRC-Bytes.
>Datenbyte     Zuordnung
>    0         Gerätekennung Low-Byte $E8
>    1         Gerätekennung High-Byte $03
>    2         Distanz Low-Byte
>    3         Distanz High-Byte
>    4         Füllhöhe Low-Byte
>    5         Füllhöhe High-Byte
>    6         Liter Low-Byte
>    7         Liter High-Byte
>    8         Inhalt in Prozent
>    9         Zustand derAusgänge
>   10         Kontrollbyte Low-Byte
>   11         Kontrollbyte High-Byte

Die Datenwürste, die ich von dem Messgerät bekomme, sehen nun z.B. so 
aus:
00 10 50 00 5D 00 3F 01 3F 00 B9 B1

Laut Herstellermail (da habe ich natürlich auch schon angefragt) ist die 
Anleitung für ein neueres Gerät, weshalb die ersten beiden Bytes bei mir 
(älteres Gerät) nicht 0xE8 und 0x03 sind. Der Rest würde aber wieder 
passen.
Außerdem wurde mir da verraten, dass das "Generatorpolynom" den Wert 
0x8005 hat. Somit müsste es sich also um eine CRC-16-IBM Berechnung 
handeln, mit "normaler" (nicht umgekehrter) Darstellung.

Mein Problem: Ich bekomme bei keinem einzigen Onlinerechner und bei 
keiner einzigen Sourcecodeimplementierung meine beiden CRC-Bytes 0xB9 
und 0xB1 raus. Oder verstehe ich das falsch?

Mir das am obigen Beispiel meiner Daten mal vorzurechnen, wäre zwar ein 
Traum, aber auch viel zu aufwendig und daher hoffe ich gar nicht erst 
drauf; aber vielleicht hat jemand mal eine Implementierung gesehen, die 
mit den obigen Daten gefüttert, genau diese CRC-Bytes berechnet. Dann 
wäre zumindest schon mal "gesichert", dass es sich wirklich um eine 
CRC-16-IBM Berechnung handeln würde.
Ach ja, als Startwert habe ich sowohl 0x0000, als auch 0xFFFF probiert; 
kam trotzdem immer was anderes raus.

Ich wäre wirklich sehr froh, wenn mir hierbei jemand helfen könnte.

Vielen Dank im voraus und viele Grüße,
Michael

PS: Ich habe auch mal versucht, jeweils nur das ungerade (oder gerade) 
Byte zu verwenden -> Klappte auch nicht :-(

Autor: Michael B. (planlessmichi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch was: Wieso fangen eigentlich alle Beispiele immer mit einer 1 an? 
Wie berechnet sich so ein Ding, wenn da vorne mal eine 0 steht? Die 
verschwindet ja dann nie, oder?

Ach Herr, wirf Hirn vom Himmel; davon brauche ich wohl noch sehr viel 
... :-(

Autor: Isch (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Isch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder wenn einem zwischendurch mal langweilig ist.

isch@isch-laptop:~$ ./a.out 
000000000001000001010000000000000101110100000000001111110000000100111111000000000000000000000000

0000000000010000010100000000
           11000000000000101

            10000101000001010
            11000000000000101

             10001010000011110
             11000000000000101

              10010100000110110
              11000000000000101

               10101000001100110
               11000000000000101

                11010000011000110
                11000000000000101

                 0010000011000011101
                   11000000000000101

                    10000110000110001
                    11000000000000101

                     10001100001101001
                     11000000000000101

                      10011000011011000
                      11000000000000101

                       10110000110111011
                       11000000000000101

                        11100001101111100
                        11000000000000101

                         010000110111100100
                          11000000000000101

                           10001101111000010
                           11000000000000101

                            10011011110001110
                            11000000000000101

                             10110111100010110
                             11000000000000101

                              11101111000100110
                              11000000000000101

                               010111100010001100
                                11000000000000101

                                 11111000100010010
                                 11000000000000101

                                  011100010001011111
                                   11000000000000101

                                    010001000101101011
                                     11000000000000101

                                      10010001011011101
                                      11000000000000101

                                       10100010110110001
                                       11000000000000101

                                        11000101101101000
                                        11000000000000101

                                         000010110110110100000
                                             11000000000000101

                                              11101101101001010
                                              11000000000000101

                                               010110110100111110
                                                11000000000000101

                                                 11101101001110110
                                                 11000000000000101

                                                  010110100111001111
                                                   11000000000000101

                                                    11101001110010101
                                                    11000000000000101

                                                     010100111001000011
                                                      11000000000000101

                                                       11001110010001101
                                                       11000000000000101

                                                        00011100100010000000
                                                           11000000000000101

                                                            010010001000010100
                                                             11000000000000101

                                                              10100010000100010
                                                              11000000000000101

                                                               11000100001001110
                                                               11000000000000101

                                                                000010000100101100000
                                                                    11000000000000101

                                                                     10001001011001010
                                                                     11000000000000101

                                                                      10010010110011110
                                                                      11000000000000101

                                                                       10100101100110110
                                                                       11000000000000101

                                                                        11001011001100110
                                                                        11000000000000101

                                                                         00010110011000110000
                                                                            11000000000000101

                                                                             11100110001101010
                                                                             11000000000000101

                                                                              010011000110111100
                                                                               11000000000000101

                                                                                1011000110111001 = 0xB1B9

Autor: Michael B. (planlessmichi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Isch:
Tausendmal dickes Dankeschön! Für beide Antworten!
Den Onlinerechner bei breitbandkatze hatte ich auch schon ausprobiert, 
aber da ist der Trick wohl das Prozentzeichen, damit der das als binäre 
Zahl ansieht, oder? Das habe ich nicht gemacht.

Und die ausführliche Berechnung: Da ist ja wirklich mal ein Traum wahr 
geworden :-) Nochmals vielen Dank. Ganz wichtig für mich ist hier z.B., 
dass ich jetzt gesehen habe, dass man anscheinend führende Nullen 
ignorieren muss. Ich hatte halt immer vorne angefangen und durch dieses 
XOR ist die erste eins (vom Polynom) dann nie verschwunden. Jetzt kann 
ich das a) nachvollziehen und b) sicher sein, dass es sich bei der 
angegebenen CRC-Summe wirklich um eine CRC-16-IBM handelt.

Also: Ganz ernsthaft: Vielen, vielen Dank!
Viele Grüße,
Michael

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.