Forum: Mikrocontroller und Digitale Elektronik Checksummenberechnung wie muss hier gerechnet werden?


von Chris T. (chris0086)


Lesenswert?

Hallo Leute,
ich brauche mal kurz eure Hilfe bei einer Checksummenberechnung
folgenden schon fertigen String habe ich:
02 FD 00 03 30 00 62 F2

02 FD Frame beginnt immer mit dieser Kennung
00 03 Anzahl der gesendeten Bytes (Adresse + CRC)
30 Befehl
00 62 Adresse des auszulesenden Wertes
F2 Checksumme (CRC)

Wie komme ich auf die Checksumme F2?
Ich habe auch einen code der aber in VB geschrieben ist und ich mich 
nicht damit auskenne:

Public Function crc(Framestr As String) As Byte
Dim count As Integer
Dim dummy As Byte
Do While (count < Len(Framestr))
count = count + 1
dummy = Asc(Mid(Framestr, count)) * 2 And &HFF
crc = crc Xor CByte(Asc(Mid(Framestr, count)) Xor dummy)
Loop End Function

Kann mir da jemand helfen was ich rechnen muss?

Grüße Christian

von holger (Gast)


Lesenswert?

>Wie komme ich auf die Checksumme F2?

Es gibt tausende Möglichkeiten eine CRC zu berechnen.
Als erstes solltest du mal erzählen um was für ein Gerät
es geht. Vieleicht kennt das ja jemand.

von Wolfgang (Gast)


Lesenswert?

holger schrieb:
> Es gibt tausende Möglichkeiten eine CRC zu berechnen.

Die VB-Funktion dürfte die Zahl der Möglichkeiten auf genau eine davon 
eingrenzen ;-)

@Chris
Was verstehst du an dem VB nicht?

von Chris T. (chris0086)


Lesenswert?

Hallo Wolfgang,
danke für die Antwort,
Es geht mir um folgende Zeilen:
dummy = Asc(Mid(Framestr, count)) * 2 And &HFF
crc = crc Xor CByte(Asc(Mid(Framestr, count)) Xor dummy)

Bei der ersten Zeile wird wohl das erste Zeichen aus dem String genommen 
und seine Repräsentation als Hexwert zurückgegeben und dann noch mit FF 
konjugiert.
allerdings weis ich nicht warum es den dummy gibt, in der zweiten Zeile 
wird dann der immer ge Xor t, aber naja so richtig raff ichs nicht am 
Beispiel.

von Wolfgang (Gast)


Lesenswert?

Chris tian schrieb:
> dummy = Asc(Mid(Framestr, count)) * 2 And &HFF

Mid(Framestr, count) fischt das count-e Zeichen aus dem String. Der 
Zeichencode davon wird anschließend mit 2 multipliziert und das Ergebnis 
auf ein Byte begrenzt.
Mit Hex-Code passiert da nix

> crc = crc Xor CByte(Asc(Mid(Framestr, count)) Xor dummy)
Umwandlung des Zeichens in Zeichencode, Xor mit dem oben erzeugten Byte 
(dummy) und Xor mit dem bisherigen crc-Byte

von Chris T. (chris0086)


Lesenswert?

Also ich gehe mal davon aus das Count bei 0 anfängt.
also erstes Zeichen(oder Byte??) 0*2 and FF -->0

dann:
0 -->Zeichencode 0 und xor mit 0

CRC wäre dann 0

ist das erstmal so richtig?

von Chris T. (chris0086)


Lesenswert?

war das oben total falsch?

>>Umwandlung des Zeichens in Zeichencode
Was ist mit Zeichencode gemeint?

: Bearbeitet durch User
von Axel S. (a-za-z0-9)


Lesenswert?

Chris tian schrieb:

>>>Umwandlung des Zeichens in Zeichencode
> Was ist mit Zeichencode gemeint?

OMFG! Grundlagen

Und nenn das bitte nicht CRC. Das ist eine simple XOR-Summe.

von Chris T. (chris0086)


Lesenswert?

Also der Hexwert...
Also gehe ich mal durch...
 Er selektiert den string also nicht nach Byte sondern nach einzelnen 
Zahl/Buchstaben.
Und fängt bei 0 an, da erstes Zeichen im String:
Dim zeichen = Asc(Buchstabe) --> Da steht jetzt 0x30 drin also Der 
Hexcode von 0

Dim dummy = CByte(zeichen * 2 And &HFF) -->0x30 wird mit 2 multipliziert 
also 0x60 und dann noch auf ein Byte begrenzt. (Cbyte wandelt es in ein 
Byte um, sollte aber trotzdem 0x60 in dummy stehen)

jetzt wird's interessant:
retVal = retVal Xor CByte(zeichen Xor dummy) --> erstmal wird 0x60 mit 
0x30 ge xor t und dann nochmal mit retval deren Initialisierungswert 0 
ist.
Ergebnis: retval --> 0x50.

Ist das so korrekt?
hab das jetzt mal auf Papier so nachgerechnet komm aber auf 0C und nicht 
auf F2, irgendwo ist da noch ein Fehler in meinen Annahmen...

von Chris T. (chris0086)


Lesenswert?

String Zeichen(hex)  Zeichen*2  Zeichen xor dummy  retval (init=0)
 0          30          60              50              50

2           32          64              56              6

F           46          8C              CA             CC

D           44          88              CC              0

0           30          60              50             50

0           30          60              50              0

0           30          60              50             50

3           33          66              55              5

3           33          66              55             50

0           30          60              50              0

0           30          60              50             50

0           30          60              50              0

6           36          6C              5A             5A

2           32          64              56     0C ungleich F2

Wo liegt der Fehler?

von Marcel (Gast)


Lesenswert?

Ist "02 FD 00 03 30 00 62 F2" der String den du bekommst oder einfach 
nur die Ausgabe der Zeichenkette in Hex Werten?

von Tobias (Gast)


Lesenswert?

02 ist das Byte... du darfst es nicht zerlegen ;)

Byte  Dummy  CRC
02  04  06
FD  FA  01
00  00  01
03  06  04
30  60  54
00  00  54
62  C4  F2

von Chris T. (chris0086)


Lesenswert?

Danke Tobias , da lag der Fehler  Supi!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.