Problem mit Hex

Gast #3659720
Lesenswert?

Hallo, Ich habe einige Probleme mit der Auswertung von HEX code auf 
Arduino.

Ich sende data, die Antwort ist dataAntwort=data.
   uint8_t data[5] = { 0x0F, 0x03, 0xF2, 0xFF, 0xFF };

   altSerial.write(data, 5);
   altSerial.readBytes(dataAntwort,5);

Die Antwort ist aber scheinbar doch unterschiedlich zum Gesendeten:
   if(memcmp(dataAntwort, data, 5) == 0)


Es ist wahrscheinlich unabhängig von dem Problem, aber wenn ich die 
letzten beiden Bytes von data (0xFF 0xFF) als Integer ausgebe erhalte 
ich -1 statt wie erwartet 65535.

   int dataInt = data[3] << 8 | data[4];
       client.print(dataInt);


Ich vermute, dass da eine Umwandlung gemacht wird.

Kann mir da jemand weiterhelfen?
Gast #3659732
Lesenswert?

penores schrieb:
> Die Antwort ist aber scheinbar doch unterschiedlich zum Gesendeten:
>    if(memcmp(dataAntwort, data, 5) == 0)

Wird diese Abfrage wahr? Wenn ja ist es gleich. Siehe Dokumentation zu 
memcmp.

penores schrieb:
> Es ist wahrscheinlich unabhängig von dem Problem, aber wenn ich die
> letzten beiden Bytes von data (0xFF 0xFF) als Integer ausgebe erhalte
> ich -1 statt wie erwartet 65535.
>
>    int dataInt = data[3] << 8 | data[4];
>        client.print(dataInt);

Ich erwarte hier eine -1. int ist nunmal was anderes als unsigned int. 
Siehe Datentypen.
Gast #3659920
Lesenswert?

Zweierkomplement war mir klar, aber es scheint wirklich an der 
Reihenfolge zu liegen. Umgedreht passt es. 0x03EA

Aber beim direkten Vergleich müsste das doch keine Rolle spielen? Wie 
kann ich das denn umgehen falls doch?
Gast #3660035
Lesenswert?

Ok das Problem liegt klar daran.

Wie bekomme ich nun in C++ den Wert 0xEA03 zu 0x03EA und dann zu 1002?
   int dataInt = data[3] << 8 | data[4];

Problem Nummer 2 liegt am gleichen. Wie soll ich die Daten denn 
abspeichern, damit die beiden Arrays übereinstimmen?

   if(memcmp(dataAntwort, data, 5) == 0)

Danke
Gast #3660394
Lesenswert?

Du musst dich entscheiden.
Entweder deine Daten sind Bytes in einem Array oder es sind Integer. Was 
denn nun? Die Programmiersprache "do what I mean" ist noch nicht 
erfunden.


> Wie ...

int dataInt = data[4] << 8 | dara[3];

Ist dir zu einfach?
Gast #3661434
Lesenswert?

Das war es wohl wirklich. ;) Danke

Nun habe ich noch ein Problem.

   uint8_t data[5] = { 0x0F, 0x03, 0xF2, 0x01, 0x02 };
   uint8_t antwort[5] = { 0x0F, 0x03, 0xF2, 0x02, 0x01 };


Die Antwort hat immer die letzten beiden bytes vertauscht. Muss ich da 
nun byte-weise vergleichen oder gibt es einen besseren Weg?

Wenn ich die Reihenfolge der Antwort komplett umdrehen möchte, wie ginge 
das damit:
   altSerial.readBytes(dataAntwort,5);
Gast #3661533
Lesenswert?

>Wenn ich die Reihenfolge der Antwort komplett umdrehen möchte, wie ginge
>das damit:
>   altSerial.readBytes(dataAntwort,5);

Sende sie in der anderen Reihenfolge, Array umsortieren.
Manche Leute sind echt zu blöd zum sch....en.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren