TIA Checksum berechnen CRC16

Florian_123

Level-2
Beiträge
29
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe folgendes Problem, ich bekomme von einem Teilnehmer über die gute alte RS232 Schnittstelle einen String übertragen (56 Zeichen lang) danach kommt die Checksum (2 Zeichen) und zum Schluss ein CR (1 Zeichen). Ich muss in diesem "String" ein paar Daten ändern und dann einfach weiterleiten, jedoch muss ich dazu eine neue Checksum berechnen.

Problem:
Art der Checksumberechnung ist nicht bekannt hab jedoch herausgefunden (durch testen, ...) dass es ich hierbei um ein "CRC16_XMODEM" handelt. Jedoch stimmt es nicht ganz, mir ist z.B. aufgefallen, dass bei manchen Konstellationen der Checksum die Checksum verändert wird.
z.B.

Aus Checksum[0] = '(' wird ')'

Aus Checksum[1] = '$0A' wird '$0B'
Aus Checksum[1] = '$0D' wird '$0E'
Aus Checksum[1] = '(' wird ')'

mehr Veränderungen sind mir bis jetzt noch nicht aufgefallen, ich kann jedoch nicht ausschließen, dass die alle Veränderungen sind.
Meine Frage lautet nun ob jemand eine Idee hat um welche Berechnung es sich handelt oder ob es eine Liste gibt, was sich alles Verändert?

Vielen Dank im Voraus

Mfg Florian
 
Hier kannst du die CRCs testen: [FONT=Verdana,Arial,Tahoma,Calibri,Geneva,sans-serif]https://crccalc.com/
Dann siehst du ob CRC16_XMODEM passt.
Danach kann man über die Programmierung reden.

Zeig uns einen gültigen String mit passender CRC.
[/FONT]
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo funkey,

ich bin durch https://crccalc.com/ auf CRC16-XMODEM gekommen aber:
String:
^D054BMS0491,040,1,0070,0,0,0532,0532,1500,0,0,0470,0150
CRC
hex E9B4
das Stimmt so weit.

Aber z.B.
String
^D054BMS0490,041,1,0372,0,0,0532,0532,1500,0,0,0470,0150

CRC empfangen:
hex 295D

CRC berechnet:
hex 285D

Wieso empfange ich 29 statt 28? (in 99% der Fällen stimmt die Checksum)

Mfg Florian
 
Hallo funkey,

Es ist nicht nur Checksum[0] auch Checksum[1]. Erst habe ich gedacht es werden nur "LF" und "CR" erhöht damit das Ende besser erkannt wird aber das mit "(" zu ")" macht keinen Sinn.

Meine Vermutung ist, dass das der Hersteller was eigenes gestrickt hat damit keiner was damit anfangen kann :-(

Trotzdem Danke schon mal.

Mfg Florian
 
Hallo NBerger,

Die Berechnung an sich ist nicht das Problem, das Problem ist, dass die Checksum die ich bekomme nicht immer mit der errechneten übereinstimmt. (siehe weiter oben)

Mfg Florian
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo PN/DP,

Es handelt sich um eine BMS Platine, welche einen Lithium Akku ausliest und mir aktuelle Daten über den Zustand liefert.
Leider gibt es keine Dokumentation.

Kunde möchte nur ein paar Daten zu Lade / Entladeparametern ändern (um den Akku zu schonen)

Mfg Florian
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
Aus Checksum[1] = '$0A' wird '$0B'
Aus Checksum[1] = '$0D' wird '$0E'

eventuell werden die Daten geändert da $0A = LF und $0D = CR ist und vom Empfänger nicht als Zeilenende Zeichen interpretiert werden. Denn die Daten werden ja ansonsten lesbar (ASCII) übertragen.

Gruß
 
Hallo,

das habe ich mir auch schon gedacht, bis dann "(" zu ")" geändert wurde.
Hab jetzt mal ein Programm am laufen um solche Veränderungen zu suchen und mitzuloggen.
Bisher treten diese Fehler nur bei "CR", "LF" und "(" auf.

Dachte nur dass es da eine andere Checksum Berechnung gibt, die das im Algorithmus hat.

Trotzdem Danke.

Mfg Florian.
 
Zurück
Oben