umwandeln in HEX für Checksumme

hey ich habe folgendes Problem:

Ich habe als asci befehl 49f1 die checksumme hierfür ist Z

um diese zu berechen muss ich 4 xor 9 xor f xor 1 = Z rechnen

dies ist ja aber so nicht möglich muss ja die 49f1 in hex umrechnen und dann:

also 34 xor 39 xor 66 xor 31 = 5a

kann mir jemand sagen wie das funktionier (aslo die umrechnung in HEX)?

zsätlich will ich ein ( hinter die checksumme hängen.

Bist Du Dir sicher, dass Du die Zeichencodes nehmen willst/mußt?
49f1 könnte schon eine Hexzahl sein. Da wäre noch etwas Info sinnvoll.

Ansonsten nimmst Du einfach die einzelnen Stellen des Char-Array und gehst diese mit einer for-Schleife durch.

Gruß Tommy

char zeichen[] = {"49f1"};

void setup()
{
  Serial.begin(9600);
  Serial.println("Anfang");
  char checksumme = zeichen[0] ^ zeichen[1] ^ zeichen[2] ^ zeichen[3];
  Serial.print("checksumme: ");
  Serial.print(checksumme);
  Serial.println("(");
}

void loop() {}

Ausgabe:

Anfang
checksumme: Z(

Danke also die checksumme wird richtig berechnet das funktioniert.
jedoch wenn ich das ganze im Serial port monitor anschaue sendet er

34 39 66 31 5a 0d 0a 49f1Z(..

wie bekomm ich dieses 0d 0a weg bzw von wo kommt das?

eigentlich soll ja nur
34 39 66 31 5a 49f1Z(

gesendet werden.

nomis321:
... 0d 0a ...

Ohne in diesem Thread irgendwas gelesen zu haben, tippe ich auf eine übertragenes Zeilenende-Zeichenfolge. Wenn es um Serial.println() geht, nimm Serial.print()

Gruß

Gregor

Das sind Steuerzeichen, die dem Fernschreiber sagen Wagenrücklauf (Carriage Return = 0x0D) und Zeilenvorschub (Line Feed = 0x0A). Heutzutage markieren sie das Ende einer Zeile, bei Windows mit CR+LF, bei Linux nur mit LF.

Ja das ganze war wegen Println.
aber wie bekomm ich sonst einen Zeilenubruch hin ich will ja das ein Befehl nach dem anderen geschickt wird.

Das ist der Zeilenvorschub. Einen anderen gibt es nicht. Also entweder weg lassen oder mit auswerten.

Sind Deine Nutzzeichen immer 4 Zeichen lang + 1 Zeichen Checksumme (plus 0xd+0xa)?

Gruß Tommy

nein manche sind auch länger wie 4 zeichen

Dann solltest Du die beiden Zeichen mit einlesen.
z.B. bei 0xd die abschließende '\0' setzen und danach noch das 0xa lesen aber nicht speichern.

Dafür gibt es im Forum einige Beispielfunktionen.

Gruß Tommy

Hi

Wenn die Checksumme per XOR gebildet wird und 0x0A nicht im Datenstrom vorkommt, kannst Du, sofern das Byte kein 0x0D ist, jedes eingelesene Byte per XOR mit der Checksumme verrechnen.
Wenn das eingelesene Zeichen 0x0D ist, prüfst Du, ob die Checksumme==0 ist.
Wenn JA, sind die übertragenen Daten inklusive Checksumme richtig übertragen worden.
Das noch kommende 0x0A musst Du noch auslesen und verwerfen.
Wenn die nächste Übertragung startet, die Checksumme vorher Nullen (wenn eine fehlerhafte Übertragung vorlag, ist die Checksumme nach dem Byte vor dem 0x0D nicht auf Null gekommen).

MfG

Tommy56:
Das ist der Zeilenvorschub. Einen anderen gibt es nicht. Also entweder weg lassen oder mit auswerten.

Das stimmt nicht. Ich hatte mal das Problem eines Kunden zu debuggen, bei dem die unterschiedlichen Arten, Zeilenumbrüche zu kodieren, die Ursache waren. Seine Windows-Software hat die ohne zu fragen nach „Windows“ konvertiert, weshalb auf Linux-Server liegende Perl-Skripte auf einmal nicht mehr funktionierten. Beheben ließ sich das auf die Schnelle nur, indem ich ein dos2unix-Konvertierer benutzt habe.

Gruß

Gregor

PS: Fies daran war, das es richtig aussah. Den Unterschied habe ich erst in einem Hex-Editor gesehen.

gregorss:
PS: Fies daran war, das es richtig aussah. Den Unterschied habe ich erst in einem Hex-Editor gesehen.

Leerzeichen vor dem Zeilenende sind meine Lieblinge. Ich nutze Notepad++, weil man sich dort all diese Dinge anzeigen und konvertieren lassen kann, auch ANSII nach UTF-8.

Nur muß man halt wissen, wonach man suchen könnte ;D

agmue:
Nur muß man halt wissen, wonach man suchen könnte ;D

Ja, und das noch mit einem Typ, der monatelang immer wieder die gleiche Art von Problemen hatte und dermaßen sauer war, dass der immer zu mir durchgestellt wurde. Wenn meine Kollegen die Augen verdreht haben, mussten sie gar nicht mehr sagen, um wen es geht.

War im Rückblick aber eine nette Übung, jemanden mit Freundlichkeit und Kompetenz zu „zähmen“. Der hat irgendwann ein Fax geschickt, in dem er meinem Chef mitteilte, wie toll es ist, wenn sich Leute um Probleme kümmern („Seit Herr S. bei Ihnen arbeitet, gibt es keine Probleme mehr“).

Gruß

Gregor