Forum: Mikrocontroller und Digitale Elektronik Problem mit Hex


von penores (Gast)


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?

von Marcel (Gast)


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.

von penores (Gast)


Lesenswert?

Leider ist die Abfrage nie wahr.

unsigned int könnte weiterhelfen, danke!

von Marcel (Gast)


Lesenswert?

Dann lass dir die Antwort doch einfach mal anzeigen.

von penores (Gast)


Lesenswert?

Mit 0xEA03 komme ich auf 59907

Wie kommt man von dem Wert auf 1002?

von Stefan R. (srand)


Lesenswert?

Indem du lernst, was das Zweierkomplement ist.

von Dirk B. (dirkb2)


Lesenswert?

Wichter wäre zu wissen was Endianness ist und welche auf deinem System 
gilt.

von penores (Gast)


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?

von penores (Gast)


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

von Penores (Gast)


Lesenswert?

Irgendwelche Ideen wie ich die Antwort richtig herum speichere?

von Karl Heinz (Gast)


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?

von penores (Gast)


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

von holger (Gast)


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.

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.