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?
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.
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?
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
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?
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);
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.