Hallo, ich bin neu zu c++ und low level Programmierung und nach dem ich ein Kommunikationsprotokoll zwischen hausgemachten Platinen entwickelt habe möchte ich die Daten mit einem CRC prüfen. Ich hab nun einiges darüber gelesen ich bin mir aber nicht sicher ob ich alles verstanden habe: Was ich brauche ist einen CRC-Algorithmus der aus einer uint16 Zahl ein uint8 generiert, da ich nur noch Platz für 3 Dez Zahlen für die Prüfsumme habe, also bis 999. D.h., wenn ich richtig verstanden habe, ich bräuchte ein CRC-8. Die CRC8 Algorithmen die ich bis jetzt gefunden habe nehmen nur unsigned char bzw. uint8 Daten an. Da ich mich nicht so gut auskenne befürchte ich sie anzupassen würde sie unbrauchbar machen. Kennt jemand vielleicht einen Algorithmus der für meine Zwecke in Frage kommt? Oder bin ich komplett auf dem falschen Weg? Grüße, Kai.
:
Gesperrt durch User
Einen uint16_t kannst du doch einfach in zwei uint8_t aufteilen. Und dann kannst du deine 8-Bit-CRC nutzen.
Rolf M. schrieb: > Einen uint16_t kannst du doch einfach in zwei uint8_t aufteilen. Und > dann kannst du deine 8-Bit-CRC nutzen. Hallo Rolf und danke für deine Antwort. Das bringt mir leider nichts da ich nur noch 999(0x3E7) frei habe, wenn ich einen uint16_t aufteile dann habe ich zwei crc8 und müsste für den zweiten dann eine neue Übertragung durchführen und das möchte ich vermeiden.
Iori Y. schrieb: > wenn ich einen uint16_t aufteile dann habe ich zwei crc8 Warum? Du weißt, was eine CRC macht? Du kannst damit die Übertragung eines beliebig langen Datenblocks absichern. Du brauchst nicht für jedes Byte eine eigene CRC.
Rolf M. schrieb: > Du kannst damit die Übertragung eines beliebig langen Datenblocks absichern. > Du brauchst nicht für jedes Byte eine eigene CRC. Davon bin ich ausgegangen, ich finde aber keinen Algorithmus der das tut. Die ich gefunden habe nehmen nur uint8 für crc8 als Data und ich weiß nicht wie die anpasse ohne sie unbrauchbar zu machen. Ein Beispiel wäre das hier von https://barrgroup.com/Embedded-Systems/How-To/CRC-Calculation-C-Code):
1 | #define POLYNOMIAL 0xD8 /* 11011 followed by 0's */ |
2 | |
3 | uint8_t crcNaive(uint8_t const message) |
4 | {
|
5 | uint8_t remainder; |
6 | |
7 | |
8 | /*
|
9 | * Initially, the dividend is the remainder.
|
10 | */
|
11 | remainder = message; |
12 | |
13 | /*
|
14 | * For each bit position in the message....
|
15 | */
|
16 | for (uint8_t bit = 8; bit > 0; --bit) |
17 | {
|
18 | /*
|
19 | * If the uppermost bit is a 1...
|
20 | */
|
21 | if (remainder & 0x80) |
22 | {
|
23 | /*
|
24 | * XOR the previous remainder with the divisor.
|
25 | */
|
26 | remainder ^= POLYNOMIAL; |
27 | }
|
28 | |
29 | /*
|
30 | * Shift the next bit of the message into the remainder.
|
31 | */
|
32 | remainder = (remainder << 1); |
33 | }
|
34 | |
35 | /*
|
36 | * Return only the relevant bits of the remainder as CRC.
|
37 | */
|
38 | return (remainder >> 4); |
39 | |
40 | }
|
Wie kann ich den anpassen dass er auch uint16_t annimmt und trotzdem noch brauchbar ist bzw. was müsste ich da beachten?
Iori Y. schrieb: > wenn > ich einen uint16_t aufteile dann habe ich zwei crc8 Überlege noch mal. Bei einer seriellen Übertragung wird CRC Byte für Byte gebildet (es wird ja auch Byte für Byte übertragen). Das gilt übrigens für CRC8, 16 oder 32. Du wirst ja wohl auch deine 16-Bit-Zahlen Byte für Byte übertragen, oder hast du ein 16bit-UART? Die etwas üblicheren UARTs berechnen bei jedem Schreiben eines Bytes den CRC-Wert weiter. Georg
georg schrieb: > Du wirst ja wohl auch deine 16-Bit-Zahlen Byte für Byte übertragen, oder > hast du ein 16bit-UART? Hallo Georg, Ich hab ein Bussystem das 0-65535 (Uint16_t) pro Übertragung erlaubt, und die möchte ich prüfen: Pro Aktion starte ich zwei Übertragungen, die erste ist für die Message, die ersten zwei Zahlen bei der zweiten Übertragung sind für die Parameter und in den übrigen 3 möchte ich die Prüfsumme reinpacken.
Beitrag #5562345 wurde von einem Moderator gelöscht.
Beitrag #5562353 wurde von einem Moderator gelöscht.
Iori Y. schrieb im Beitrag #5562353: > Route 6. schrieb: >> Iori Y. schrieb: >>> Ich hab ein Bussystem das 0-65535 (Uint16_t) pro Übertragung erlaubt, >>> und die möchte ich prüfen: Pro Aktion starte ich zwei Übertragungen, die >>> erste ist für die Message, die ersten zwei Zahlen bei der zweiten >>> Übertragung sind für die Parameter und in den übrigen 3 möchte ich die >>> Prüfsumme reinpacken. >> >> Was ist denn das für ein gequirlter Mist? >> >> Bahnhof! > > Dein Beitrag ist nichts weiter als aggressiver inhaltloser Spam. Du bist > nicht verpflichtet zu helfen, wenns dir zu doof ist dich mit Anfänger > rumzuschlagen und du nichts konstruktives beizutragen hast dann kannst > du es auch einfach lassen. Ich kann ihn andererseits verstehen. Dir wurde schon paarmal erklärt, daß du die Prüfsumme Byte für Byte berechnen kannst. Und zwar, nachdem du vom ersten 16-Bit-Wert das erste Byte nimmst, damit die CRC berechnest und anschließend das zweite Byte des 16-Bit-Wertes. Davon auch wieder die CRC. Dann gehst du zum nächsten 16-Bit-Wert, nimmst davon das erste Byte, davon die CRC und so weiter. Du nimmst dir alle Werte nacheinander Byte für Byte vor und bildest damit jedesmal die CRC. Das war eine Menge Text, aber ich hoffe, jetzt ist der Knoten geplatzt :-)
Iori Y. schrieb im Beitrag #5562353:
> und du nichts konstruktives beizutragen hast
Wie soll man bei solch unverständlicher Beschreibung denn helfen können?
Du könntest dein Problem wenigstens so erklären, das man technische
Ratschläge geben kann.
Deine Beschreibung hört sich so an: Ich will zwei u_int16 übertragen.
Beispiel:
erstes u_int16= 48001 (dezimal!)
hier bedeutet 48001 die Message
zweites u_int16= 37241 (dezimal!)
hier bedeuten 37 die Parameter und für 241 soll die zu berechnende
u_int8 CRC eingesetzt werden.
Wenn dem so ist, dann ist das wirklicher Schwachsinn!
Route 6. schrieb: > Iori Y. schrieb im Beitrag #5562353: > Du könntest dein Problem wenigstens so erklären, das man technische > Ratschläge geben kann. > > Deine Beschreibung hört sich so an: Ich will zwei u_int16 übertragen. > Beispiel: > erstes u_int16= 48001 (dezimal!) > hier bedeutet 48001 die Message > > zweites u_int16= 37241 (dezimal!) > hier bedeuten 37 die Parameter und für 241 soll die zu berechnende > u_int8 CRC eingesetzt werden. > > Wenn dem so ist, dann ist das wirklicher Schwachsinn! Und ich finde deine Einstellung schwachsinn! Du kannst meinen Beitrag auch 100 mal als mist und schwachsinn bezeichnen, das mag sein dass das dir dabei hilft dich abzureagieren und deinen Tag zu verarbeiten, mir hilft das aber nicht weiter.
Iori Y. schrieb: > mir > hilft das aber nicht weiter. Genau richtig! Dir kann Keiner helfen, wenn du dein Problem nicht verständlich beschreibst. Wenn das, was ich rein gedeutet habe richtig ist, kann dir auch Keiner helfen.
Iori Y. schrieb: > Und ich finde deine Einstellung schwachsinn! Nichtdestotrotz hat Route 6. Recht wenn seine Erklärung deiner Beschreibung stimmt. Beschäftige dich erst mal mit den Unterschieden zwischen Binär, Dezimal und Hexadezimal. Erst wenn du das alles verstanden hast, kannst du dich dem CRC widmen.
Route 6. schrieb: > Dir kann Keiner helfen, wenn du dein Problem nicht verständlich > beschreibst. Ich habe nicht behauptet ich habe mein Problem super beschreiben, aber man könnte darauf hinweisen wo es hackt anstatt einfach zu kommentieren das ist alles Mist. Ich habe übrigens deswegen gleich am Anfang als ersten Satz geschrieben ich bin neu zu der ganzen Thematik und auch zu c++ damit intolerante Forumrambos mir gleich vom Leib weg bleiben. > Wenn das, was ich rein gedeutet habe richtig ist, kann dir auch Keiner > helfen. Wer mir nicht helfen kann hat die Möglichkeit es zu lassen, in den Beitrag reinzuspamen bringt rein gar NICHTS.
Iori Y. schrieb: > Davon bin ich ausgegangen, ich finde aber keinen Algorithmus der das > tut. Die ich gefunden habe nehmen nur uint8 für crc8 als Data und ich > weiß nicht wie die anpasse ohne sie unbrauchbar zu machen. > > Ein Beispiel wäre das hier von > https://barrgroup.com/Embedded-Systems/How-To/CRC-Calculation-C-Code): Da hast du dir genau das eine Beispiel rausgesucht. Selbst auf dieser Seite ist es von mehreren Beispielen das einzige, das nur ein Byte annimmt. Hast du nach diesem Beispiel mal weitergelesen?
Iori Y. schrieb: > in den Beitrag reinzuspamen bringt rein gar NICHTS. Nur mal eine Frage: Hast du meinen Beitrag gelesen? Beitrag "Re: CRC-8 from uint16"
Wenn es dir nicht darum geht, den CRC-Algorithmus selbst zu verstehen und zu implementieren, würde ich dir die Verwendung eines Code-Generators empfehlen. Ich nutze gerne diesen hier, da er eine Vielzahl von standardisierten CRC-Varianten unterstützt und kompakten und schnellen Code erzeugt. Ansonsten kannst du dir auch den erzeugten Code mal ansehen und vll. so besser verstehen, wie man eine CRC-8 für einen beliebig langen Inputstring erzeugen kann. Hier direkt die Seite mit den Beispielen: https://pycrc.org/tutorial.html
Narfie schrieb: > Ich nutze gerne diesen hier, da er eine Vielzahl von standardisierten > CRC-Varianten unterstützt und kompakten und schnellen Code erzeugt. > Ansonsten kannst du dir auch den erzeugten Code mal ansehen und vll. so > besser verstehen, wie man eine CRC-8 für einen beliebig langen > Inputstring erzeugen kann. Hier direkt die Seite mit den Beispielen: > https://pycrc.org/tutorial.html Ich werde sie mir anschauen, danke.
Iori Y. schrieb: > Was ich brauche ist einen CRC-Algorithmus der aus einer uint16 Zahl ein > uint8 generiert, da ich nur noch Platz für 3 Dez Zahlen für die > Prüfsumme habe, also bis 999. Sprich: du hast effektiv 24Bit. Selbst wenn man das für die Übertragung auf Buchstaben, Zahlen und zwei Sonderzeichen beschränkt (siehe z.B.: BASE64), sind's immer noch 18Bit. Sprich: Da passt natürlich locker eine CRC16 rein! Selbst wenn das Protokoll auf "Menschenlesbarkeit" optimiert sein soll: bei einer Prüfsumme spielt es keine Rolle, ob in den drei Zeichen nur Ziffern erscheinen, oder ob da auch Sachen stehen können wie etwa '9+W'. Der normale Mensch ist sowieso nicht in der Lage, die Prüfsummenberechnung im Kopf nachzuvollziehen...
c-hater schrieb: > Sprich: Da passt natürlich locker eine > CRC16 rein! Das sagst du jemandem, der mit CRC8 schon hoffnungslos überfordert ist... Georg
Rolf M. schrieb: > Iori Y. schrieb: >> wenn ich einen uint16_t aufteile dann habe ich zwei crc8 > > Warum? Du weißt, was eine CRC macht? Du kannst damit die Übertragung > eines beliebig langen Datenblocks absichern. Du brauchst nicht für jedes > Byte eine eigene CRC. georg schrieb: > Das sagst du jemandem, der mit CRC8 schon hoffnungslos überfordert > ist... Dann verschwende deine Zeit nicht bei einem Hoffnungslosen Fall und tu uns damit beide einen Gefallen ;-)
c-hater schrieb: > Sprich: du hast effektiv 24Bit. Selbst wenn man das für die Übertragung > auf Buchstaben, Zahlen und zwei Sonderzeichen beschränkt (siehe z.B.: > BASE64), sind's immer noch 18Bit. Sprich: Da passt natürlich locker eine > CRC16 rein! Danke für deinen Beitrag. Ich kann pro Übertragung genau 16 Bits schicken und zwar in form von Zahlen von 0 bis 65535, Sonderzeichen etc. sind nicht möglich. Ich habs jetzt hingekriegt einen Algorithmus für meine Zwecke anzupassen der auch genau das Selbe spuckt wie die Online Kalkulatoren, damit ist der Fall erledigt.
Rolf M. schrieb: > Iori Y. schrieb: >> wenn ich einen uint16_t aufteile dann habe ich zwei crc8 > > Warum? Du weißt, was eine CRC macht? Du kannst damit die Übertragung > eines beliebig langen Datenblocks absichern. Du brauchst nicht für jedes > Byte eine eigene CRC. Eric B. schrieb: > Aber gelernt hast du nix. Ich muss dich leider enttäuschen, mein Wissen hat sich diesbezüglich im Vergleich zur Ausgangslage wesentlich verbessert, sonst würde ja mein angepasster Algorithmus nicht die selben Ergebnisse spucken wie die Online-Kalkulatoren ;-) Das Meiste habe ich jedoch nicht hier gelernt sondern in einem anderen englischen sprachigen Forum wo es wesentlich weniger aggressive eklige Forumrambos gibt.
Iori Y. schrieb: > Ich kann pro Übertragung genau 16 Bits schicken und zwar in form von > Zahlen von 0 bis 65535, Sonderzeichen etc. sind nicht möglich. Zuvor hast du etwas ganz anderes behauptet (ich zitiere dich selbst): > da ich nur noch Platz für 3 Dez Zahlen für die Prüfsumme habe, also bis > 999. Das passt mit deiner jetzigen Aussage nicht zusammen. Vermutlich hast du sowas von keine Ahnung von irgendwas, dass du nicht mal in der Lage bist, zu formulieren, wo die Hose genau zwickt... Insbesondere scheinst du keine Ahnung vom Unterschied zwischen Zahlen/Zeichen und ihren Repräsentationen zu haben. Du solltest also etwas über Codierungen lernen. Und zwar VOR jeder weiteren Aktivität beim Programmieren. Ohne diese Grundlagenkenntnisse kann beim Programmieren nämlich höchstens mal zufällig etwas Sinnvolles rauskommen, in aller Regel wird aber Müll rauskommen.
c-hater schrieb: > Das passt mit deiner jetzigen Aussage nicht zusammen. Vermutlich hast du > sowas von keine Ahnung von irgendwas, dass du nicht mal in der Lage > bist, zu formulieren, wo die Hose genau zwickt... > > Insbesondere scheinst du keine Ahnung vom Unterschied zwischen > Zahlen/Zeichen und ihren Repräsentationen zu haben. Du solltest also > etwas über Codierungen lernen. Und zwar VOR jeder weiteren Aktivität > beim Programmieren. Ohne diese Grundlagenkenntnisse kann beim > Programmieren nämlich höchstens mal zufällig etwas Sinnvolles > rauskommen, in aller Regel wird aber Müll rauskommen. Ich hatte folgendes geschrieben: >>> Ich hab ein Bussystem das 0-65535 (Uint16_t) pro Übertragung erlaubt. Da steht ganz klar was ich verschicken kann, nämlich zahlen von 0 bis 65535. Du übersiehst sowohl den Uint16 als auch Intervall von 0 bis 65535 und bildest dir ein was ich alles verschicken darf und was nicht und jetzt kommt dein Ego damit nicht klar dass deine Hilfe Bullshit war, bedankt habe ich mich dafür nur aus Höflichkeit. Selbst wenn ich mich wirklich nicht richtig ausgedruckt habe gibt es ja sogenannte Gesprächmanieren und Höflichkeitsregeln, da muss man sich nicht gleich so asozial und beleidigend ausdrucken, da hätten dir deine Eltern ein bisschen mehr beibringen sollen außer den Unterschied zwischen Zahlen und Zeichen. Am besten suchst du dir selber Hilfe bevor du anfängst Anderen zu "helfen".
Iori Y. schrieb: > Da steht ganz klar was ich verschicken kann, nämlich zahlen von 0 bis > 65535. Was soll denn das für ein Bussystem sein? Ist das eine serielle Schnittstelle, oder ist das irgendein paralleler Bus?
Iori Y. schrieb: > Ich hatte folgendes geschrieben: >>>> Ich hab ein Bussystem das 0-65535 (Uint16_t) pro Übertragung erlaubt. > Da steht ganz klar was ich verschicken kann, nämlich zahlen von 0 bis > 65535. Unklar ist allerdings, wo dann die CRC versendet wird und warum du dafür drei dezimale Ziffern verfügbar hast. Das ist für ein binäres Protokoll eher ungewöhnlich, und wenn du nur die 16 abzusichernden Bits übertragen kannst, auf welchen Weg kommen dann die drei Ziffern für die CRC ans Ziel? > Selbst wenn ich mich wirklich nicht richtig ausgedruckt habe gibt es ja > sogenannte Gesprächmanieren und Höflichkeitsregeln, da muss man sich > nicht gleich so asozial und beleidigend ausdrucken, Ja, "c-hater" ist leider für seinen beleidigenden Ton bekannt. Hier hat er immerhin auf seine sonst übliche Fäkalsprache verzichtet, die schon zur Löschung von so vielen seiner Postings geführt hat.
Iori Y. schrieb: > bildest dir ein was ich alles verschicken darf und was nicht Nein, ich bilde mir garnix ein. Das Zitat: > da ich nur noch Platz für 3 Dez Zahlen für die Prüfsumme habe, also bis > 999. Ist ja wirklich ebenfalls von dir. Und den offensichtlichen Widerspruch zu deiner nunmehrigen Kanalbeschreibung hast du in keinster Weise aufgeklärt. Zumal: Wenn der Kanal nun nach neuester Einlassung 16-Bit-Zahlen erlaubt, ist es doch erst recht kein Problem, eine CRC16 darüber zu versenden. Da braucht man ja noch nichtmal irgendwas umzukodieren, sondern kann sie einfach "as is" über den Kanal versenden. Ich bleibe dabei: du hast absolut keine Ahnung, was du da eigentlich tust. C&P-"Programmierer".
Rufus Τ. F. schrieb: > Was soll denn das für ein Bussystem sein? > > Ist das eine serielle Schnittstelle, oder ist das irgendein paralleler > Bus? Wir verwenden ein SPI, die Einschränkung liegt aber nicht daran. Sieh es mir bitte nach dass ich wo anders viel weiter gekommen bin und das Thema schon erledigt ist und daher keinen Sinn darin sehe unser System hier weiterhin zu erklären vor allem wo so viele Internetrambos lauern die nur darauf warten eine Lücke zu finden um ihre Frust rauszulassen. Rolf M. schrieb: > Ja, "c-hater" ist leider für seinen beleidigenden Ton bekannt. Hier hat > er immerhin auf seine sonst übliche Fäkalsprache verzichtet, die schon > zur Löschung von so vielen seiner Postings geführt hat. Zu meiner Zeit wurden bei solchen nicht nur die Posts gelöscht sondern auch die Accounts gesperrt und die wurden erst freigeschaltet wenn ihre Therapeuten wieder das Okay gegeben haben. Denn ein Forum sollte ein Ort sein wo man sich hilft, austauscht mit einander Spaß hat und sich weiter entwickelt und nicht ein Platz für Menschen die ein armseliges Leben haben und verzweifelt in Foren nach Rache und Überlegenheit suchen.
Iori Y. schrieb: > Denn ein Forum sollte ein Ort > sein wo man sich hilft, austauscht mit einander Spaß hat Nein, das sehen der Betreiber und die Mods hier ganz anders: mit Harmonie ist nicht genug los, also muss man Krawall fördern, dann wird das Forum richtig gross. Z.B. wurde extra dafür die Bewertungsfunktion eingeführt, damit man andere mit einem einfachen Mausklick niedermachen kann. Es ist kein Wunder dass das Forum genauso geworden ist wie man sich das wünscht. Georg
georg schrieb: > damit man andere mit einem einfachen Mausklick niedermachen kann. Was heißt "niedermachen"? Wer sich von einer Bewertung "niedermachen" läßt, kann wohl nicht besonders viel Selbstvertrauen haben?
npn schrieb: > Wer sich von einer Bewertung "niedermachen" > läßt, kann wohl nicht besonders viel Selbstvertrauen haben? Du findest es wohl gut, wenn ein harmloser und konstruktiver Beitrag negative Bewertungen bekommt? Warum? Weil das Leben in die Bude brint? Hauptsache Streit? Bewirb dich als Mod. Georg
georg schrieb: > npn schrieb: >> Wer sich von einer Bewertung "niedermachen" >> läßt, kann wohl nicht besonders viel Selbstvertrauen haben? > > Du findest es wohl gut, wenn ein harmloser und konstruktiver Beitrag > negative Bewertungen bekommt? Warum? Weil das Leben in die Bude brint? > Hauptsache Streit? Bewirb dich als Mod. > > Georg Du bist also auch so einer ohne Selbstvertrauen. :-)
georg schrieb: > npn schrieb: >> Wer sich von einer Bewertung "niedermachen" >> läßt, kann wohl nicht besonders viel Selbstvertrauen haben? > > Du findest es wohl gut, wenn ein harmloser und konstruktiver Beitrag > negative Bewertungen bekommt? Lies doch mal selber deine Postings und überlege dir, ob die nicht etwas absurd klingen. Deine Schlussfolgerung, weil es Leute gibt, die die Bewertungsfunktion missbrauchen, könne das einzige Ziel der Bewertungsfunktion nur sein, dass man gute Postings negativ bewertet und jeder, der die Bewertungen nicht so ernst nimmt, wäre voll dafür, sowas zu tun, kann ich jedenfalls nur mit dem Wort "absurd" beschreiben.
Rolf M. schrieb: > Lies doch mal selber deine Postings Wenn ich mich selber in Frage stelle, kann ich mit den bekannten Streitsuchern und Pöblern an Selbstbewusstsein nicht annähnernd mithalten, und dann überzieht mich npn mit Häme und Spott - euch beiden kann ich es also nie recht machen. Also versuche ich das garnicht erst. Hier zählt halt, seine Meinung durchzusetzen und niemals einen Irrtum zuzugeben, und zur Betonung das ganze noch mit ein paar unflätigen Beleidigungen zu garnieren. Du hast sicher nichts davon bemerkt dass sich hier immer mehr User, besonders neue, über den Umgangston beklagen - warum auch, er ist ja genau so wie gewünscht. Da das nicht mein Stil ist beteilige ich mich auch immer weniger, und deshalb habe ich auch meinen Account gelöscht. Georg
@Rolf M. und georg Prügelt euch woanders. Es hat mit dem Thema nichts zu tun. Der Anfänger, der hier gefragt hatte, wollte Hilfe zur CRC8. Die hat er anderswo in einem Forum bekommen. Über das fachliche Niveau dort muss ich nicht spekulieren: Bastler eben...