Hallo! Ich möchte gern eine CRC16 prüfung umsetzen. Dazu gibts ja eine wunderschöne Funktion im GCC in der CRC16.h. Doch ich kapier diese nicht. Ich habe mir hier im Wiki den Artikel zu CRC durchgelesen und soweit das Prinzip davon verstanden. Doch jetzt frage ich mich, welche beiden Übergabewerte will die Funktion haben? static _inline_ uint16_t _crc16_update(uint16_t __crc, uint8_t __data) Also welchen Wert meint hier __crc und welchen Wert __data? Und was bekomme ich nun schlussletzendlich wieder zurück? Das Polynominal wird ja als Zahlenwert in der Funktion geschrieben, nicht als Variable, also kann ich das ja schonmal nicht an die Funktion übergeben.. Ich kapiers einfach nicht, ich hoffe, es bringt jemand etwas Licht in mein Dunkel. Danke dafür schonmal imm Voraus. Dennis
Timmo H. schrieb: > http://www.nongnu.org/avr-libc/user-manual/group__util__crc.html das hab ich soweit gelesen, dort ersehe ich raus, das dort mit crc und data eine xor Operation gemacht wird. Ich frage mich einfach, warum wird diese Operation vorher gemacht. Diese ist im Artikel über CRC so für mich nicht ersichtlich, deswegen verstehe ich sie nicht. Ich denke, wenn ich das kapiert habe, kann ich mir selber beantworten, welche Daten die Funktion haben möchte. Ich denke, es ist einfach eine Art Code-Optimierung, die ich nicht kapiere. Dennis
Willst Du die Funktion benutzen oder verstehen was passiert, ansonsten scheint das Beispiel doch verständlich zu sein.
Dennis H. schrieb: > Ich denke, wenn > ich das kapiert habe, kann ich mir selber beantworten, welche Daten die > Funktion haben möchte. Nö, das ist ein Detail der Implementierung, dessen Verständnis dich wohl eher nicht deiner ursprünglichen Fragestellung näher bringt. Das erste Code-Beispiel unter dem Link ist das, was dir zeigt wie die CRC-Funktionen zu verwenden sind. Das ist es, was du studieren solltest. Das ist eigentlich ziemlich selbsterklärend.
Ich will sie nur verwenden. Für mich heißt das, ich gebe dieser Funktion meine Variable, die ich gern mit einer prüfsumme versehen möchte. Und ich bekomme genau meine Variable plus Prüfsumme wieder. Eine Variable übergeben, eine zurück bekommen. Diese Funktion will aber zwei Variablen übergeben bekommen.. Dennis
Dennis H. schrieb: > Eine Variable > übergeben, eine zurück bekommen. Diese Funktion will aber zwei Variablen > übergeben bekommen.. Weil eine CRC nun mal eher selten für nur eine Variable benutzt wird, sondern für einen ganzen Block von Daten. Der eine Parameter ist die aktuelle (fortlaufende) CRC, der Zweite das nächste Datenbyte, und der Rückgabewert ist die neue CRC.
Oh Man, Asche auf mein Haupt, das hätte ich wirklich selber sehen sollen, ich danke dir, das du es mir trotzdem erklärt hast. Dennis
Naja, intuitiv finde ich es aber auch nicht grade. Wieso nimmt die Funktion nicht einfach einen Zeiger und eine Längenangabe entgegen? Spricht da vom Prinzip her was dagegen?
Moin, wenn du seriell reinkommende Daten (Stream) immer erst komplett puffern kannst, nichts. MfG
Heinz schrieb: > Wieso nimmt die Funktion nicht einfach einen Zeiger und eine > Längenangabe entgegen? > Spricht da vom Prinzip her was dagegen? Es wäre weniger flexibel. Weiteres Beispiel neben dem, was "Sauger" geschrieben hat, wenn die Datensätze unterschiedliche Längen haben können und mit einer Terminierung versehen sind (z.B. Strings), dann müsste der Datensatz zweimal durchlaufen werden. Einmal in der CRC-Funktion und einmal vorab, um überhaupt erst mal die Länge festzustellen. So kann man einfach einen Wrapper darum legen, der dann das gewünschte Interface hat. Z.B. dein Zeiger/Länge-Interface, oder eines wo nur ein Zeiger übergeben wird (bei fester Länge, oder bei Terminierung), oder die Wrapper-Funktion liefert die CRC gar nicht zurück, sondern fügt sie gleich dem Datensatz hinzu, oder ...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.