![]() |
checksum eines RS232-strings erstellen
Ein serielles Gerät verlangt zu jedem Befehl eine Checksum. Wie kann ich diese jedoch berechnen? Hier ein paar Beispiele:
- #$FF#$30#$00 -> #$D1 - #$FF#$90#$02#$00#$FF -> #$70 - #$FF#$D0#$02#$00#$05 -> #$2A Die Beschreibung des Herstellers lautet wie folgt: "...If all message bytes excluding the preamble are summed and the lower byte value of the result equals zero, the message is valid and it may be processed. The checksum value of the message should be included in the summation." Die hier besprochene Preambel (#$FA) habe ich bei den Beispielen bereits weggelassen. Eine simple Aufaddierung mit
Delphi-Quellcode:
gibt leider nicht das gesuchte Resultat. Wie muss ich diese Quersumme berechnen?
sum := 0;
if i := 0 to length(s)-1 then inc(sum, ord(s[i])): |
AW: checksum eines RS232-strings erstellen
s ist ein String, richtig? Dann musst Du von 1 bis Length gehen.
|
AW: checksum eines RS232-strings erstellen
Ja s ist ein String und ich habe tatsächlich bei 1 begonnen (mein Fehler beim Umschreiben). Für FF1000 erhalte ich 10F an Stelle von F1. Wieso? Was mache ich falsch?
|
AW: checksum eines RS232-strings erstellen
Du musst eigentlich nur genau das machen was der Herstelle beschreibt
#$FF#$30#$00 -> #$D1 $ff+$30+$00=$12F Dass untere Byte muss genullt werden $12F +$d1= $200 => Übertragung gültig |
AW: checksum eines RS232-strings erstellen
Du musst einen String senden, der Checksum 0 hat. Dazu musst Du die zu sendenden Zeichen aufaddieren, das höherwertige byte ignorieren ind dann das niederwertige byte komplementieren und anhängen, dann hat Dein String insgesamt die Checksum 0.
Gruß Erich |
AW: checksum eines RS232-strings erstellen
Entschuldigt, aber wie sieht das als Code aus, wenn ich die Summe (12F) habe?
|
AW: checksum eines RS232-strings erstellen
Delphi-Quellcode:
sum := 0;
if i := 1 to length(s) then inc(sum, ord(s[i])); checkchar := char((not sum) and $FF); s := s + checkchar; |
AW: checksum eines RS232-strings erstellen
Danke, der Code ergibt jedoch für FFD0020005 2E an Stelle von 2A und für FF1000 F0 an Stelle von F1.
|
AW: checksum eines RS232-strings erstellen
Delphi-Quellcode:
sum := 0;
for i := 1 to length(s) do inc(sum, ord(s[i])); checkchar := char(-sum and $FF); |
AW: checksum eines RS232-strings erstellen
Der Code sieht nun so aus:
Delphi-Quellcode:
und liefert bei 3 bytes den korrekten Wert, also FF1000 -> F1 oder FF3000 -> D1. Sobald der String jedoch länger wird, stimmt es nicht mehr:
function CalculateChecksum(s: string): Longint;
var i, sum: integer; checkchar : Char; begin sum := 0; for i := 0 to length(s)-1 do inc(sum, ord(s[i])); checkchar := char((- sum) and $FF); Result := Ord(checkchar); end; - FF64020006 ergibt 9B, sollte 95 sein - FF900200FF ergibt 6F, sollte 70 sein - FFD20400000005 ergibt 2B, sollte 26 sein Was muss man noch ändern? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz