Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi checksum eines RS232-strings erstellen (https://www.delphipraxis.net/156767-checksum-eines-rs232-strings-erstellen.html)

GPR-Man 14. Dez 2010 13:33

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:
  sum := 0;
  if i := 0 to length(s)-1 then
    inc(sum, ord(s[i])):
gibt leider nicht das gesuchte Resultat. Wie muss ich diese Quersumme berechnen?

DeddyH 14. Dez 2010 13:53

AW: checksum eines RS232-strings erstellen
 
s ist ein String, richtig? Dann musst Du von 1 bis Length gehen.

GPR-Man 14. Dez 2010 14:01

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?

v2afrank 14. Dez 2010 14:12

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

LargoD 14. Dez 2010 14:13

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

GPR-Man 14. Dez 2010 14:23

AW: checksum eines RS232-strings erstellen
 
Entschuldigt, aber wie sieht das als Code aus, wenn ich die Summe (12F) habe?

shmia 14. Dez 2010 14:28

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;

GPR-Man 14. Dez 2010 15:00

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.

gammatester 14. Dez 2010 15:57

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);

GPR-Man 15. Dez 2010 06:55

AW: checksum eines RS232-strings erstellen
 
Der Code sieht nun so aus:
Delphi-Quellcode:
  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;
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:
- 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 19:45 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz