AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

checksum eines RS232-strings erstellen

Ein Thema von GPR-Man · begonnen am 14. Dez 2010 · letzter Beitrag vom 15. Dez 2010
Antwort Antwort
Seite 1 von 2  1 2      
GPR-Man

Registriert seit: 28. Okt 2008
Ort: Zürich
14 Beiträge
 
RAD-Studio 2009 Pro
 
#1

checksum eines RS232-strings erstellen

  Alt 14. Dez 2010, 14:33
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?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.616 Beiträge
 
Delphi 12 Athens
 
#2

AW: checksum eines RS232-strings erstellen

  Alt 14. Dez 2010, 14:53
s ist ein String, richtig? Dann musst Du von 1 bis Length gehen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
GPR-Man

Registriert seit: 28. Okt 2008
Ort: Zürich
14 Beiträge
 
RAD-Studio 2009 Pro
 
#3

AW: checksum eines RS232-strings erstellen

  Alt 14. Dez 2010, 15:01
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?
  Mit Zitat antworten Zitat
v2afrank

Registriert seit: 9. Mai 2005
Ort: Bocholt
573 Beiträge
 
Delphi XE2 Professional
 
#4

AW: checksum eines RS232-strings erstellen

  Alt 14. Dez 2010, 15:12
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
  Mit Zitat antworten Zitat
LargoD

Registriert seit: 8. Jun 2007
42 Beiträge
 
#5

AW: checksum eines RS232-strings erstellen

  Alt 14. Dez 2010, 15:13
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
  Mit Zitat antworten Zitat
GPR-Man

Registriert seit: 28. Okt 2008
Ort: Zürich
14 Beiträge
 
RAD-Studio 2009 Pro
 
#6

AW: checksum eines RS232-strings erstellen

  Alt 14. Dez 2010, 15:23
Entschuldigt, aber wie sieht das als Code aus, wenn ich die Summe (12F) habe?
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#7

AW: checksum eines RS232-strings erstellen

  Alt 14. Dez 2010, 15:28
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;
Andreas
  Mit Zitat antworten Zitat
GPR-Man

Registriert seit: 28. Okt 2008
Ort: Zürich
14 Beiträge
 
RAD-Studio 2009 Pro
 
#8

AW: checksum eines RS232-strings erstellen

  Alt 14. Dez 2010, 16:00
Danke, der Code ergibt jedoch für FFD0020005 2E an Stelle von 2A und für FF1000 F0 an Stelle von F1.
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#9

AW: checksum eines RS232-strings erstellen

  Alt 14. Dez 2010, 16:57
Delphi-Quellcode:
sum := 0;
for i := 1 to length(s) do inc(sum, ord(s[i]));
checkchar := char(-sum and $FF);
  Mit Zitat antworten Zitat
GPR-Man

Registriert seit: 28. Okt 2008
Ort: Zürich
14 Beiträge
 
RAD-Studio 2009 Pro
 
#10

AW: checksum eines RS232-strings erstellen

  Alt 15. Dez 2010, 07:55
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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:29 Uhr.
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