ich nutze die Bibliothek lmic.h um Daten über LoRaWAN zu empfangen. Mein Problem ist, dass ich die letzten beiden Bytes in meinem Frame, nicht in ein integer umgewandelt bekomme.
Ich habe es schon mit atoi() versucht und es klappt leider nicht. Könnt ihr mir weiterhelfen?
Mein Code:
case EV_TXCOMPLETE:
Serial.println(F("EV_TXCOMPLETE (includes waiting for RX windows)"));
if (LMIC.txrxFlags & TXRX_ACK)
Serial.println(F("Received ack"));
if (LMIC.dataLen) {
Serial.println(F("Received "));
Serial.println(LMIC.dataLen);
Serial.print(F(" bytes of payload."));
//Serial.write(LMIC.frame+LMIC.dataBeg, LMIC.dataLen);
int laenge = LMIC.dataLen - 2;
laengerBytes += laenge;
Serial.print("Länge insgesamt: ");
Serial.println(laengerBytes);
char letztenBytes[2];
Serial.print("Die letzten beiden:\n");
for(int k=0;k<2;k++) {
Serial.print(laenge+k);
letztenBytes[k] = (LMIC.frame[LMIC.dataBeg+laenge+k]);
Serial.print(" ");
Serial.print(letztenBytes[k]);
Serial.print(" ");
Serial.print(letztenBytes[k], HEX);
}
Serial.print("\nDas wert in z1:");
Serial.print(letztenBytes[0]);
Serial.print("\nDas wert in z2:");
Serial.print(letztenBytes[1]);
char buf[3];
buf[0] = letztenBytes[1];
buf[1] = letztenBytes[2];
buf[2] = '\0';
int ni;
ni = atoi(buf);
Serial.print("Das wert in N:");
Serial.print(ni);
}
// Schedule next transmission
os_setTimedCallback(&sendjob, os_getTime()+sec2osticks(TX_INTERVAL), do_send);
Dir fehlen die Grundlagenkenntnisse zu char-Arrays, deshalb wird das bei Dir nichts mit atoi.
Die 2 Bytes müssen mit '\0' abgeschlossen werden (also 3 Bytes sein), damit atoi damit arbeiten kann.
Infos hier.
In buf[2] passen nur 2 Zeichen rein. buf[2]=’\0’ ist außerhalb Deines Arrays.
Wir wissen ja auch nicht, ob Du die Daten binär oder als Text schickst.
Bei binär ist der Weg über das char-Array mit 0-Terminator natürlich nicht sinnvoll.
Gib uns mehr Info, wenn Du zu einer Lösung kommen willst. z.B. einen Link zu Deiner Lib.
DAS IST DAS GLEICHE.
Da gibts nichts zum Umwandeln.
Das was du da siehst ist nur die Representation für dich zum lesen.
Für den Micro ist das das GLEICHE.
Öffne mal am PC deinen calc, schalte ihn um auf Programmierer und spiele da mit einzelnen Zahlen in hex/dez/bin damit du ein Gefühl dafür bekommst.
DAS IST DAS GLEICHE.
Da gibts nichts zum Umwandeln.
Das was du da siehst ist nur die Representation für dich zum lesen.
Für den Micro ist das das GLEICHE.
Öffne mal am PC deinen calc, schalte ihn um auf Programmierer und spiele da mit einzelnen Zahlen in hex/dez/bin damit du ein Gefühl dafür bekommst.
das ist mir bewusst. Dann stelle ich meine Frage besser.
Ich bekomme ein Frame und die letzten beiden Bytes ist meine Folgenummer. Diese Folgenummer will ich mit der erwarteten Folgenummer verglichen.
Wenn du glaubst, dass du 10 bekommst, bekommst du 0x10.
0x10=0d16
nein, durch das Bitschiften wird daraus kein “16” … das bitschiften multipliziert mit 256.
Darum habe ich vorhin gesagt du sollst mal deinen Calc anwerfen.
gib in dec 1 ein und LSH 8 … na was kommt raus???
Du hast das Byte um 8 stellen verschoben. also mit 256 multipliziert.
jetzt machst das ganze mal mit deiner 23 nach was kommt raus?
Was kommt raus wenn du nun 41 dazu zählst?
Du das sind wirklich Basics.
nächster Schritt nach dem calc.exe:
lade das mal hoch und schau dir an, was der Serial Monitor ausgibt.
void setup() {
Serial.begin(115200);
Serial.println(F("HEX DEC Nachhilfe"));
byte myArray[4];
myArray[0] = 0xAA;
myArray[1] = 0xBB;
myArray[2] = 0x23;
myArray[3] = 0x41;
//a Darstellung in HEX
Serial.println(F("Darstellung in HEX"));
Serial.print(myArray[2], HEX); Serial.print(" "); Serial.println (myArray[3], HEX);
int zahl = myArray[2] << 8 | myArray[3];
Serial.println(F("ein Zahl in HEX"));
Serial.print(F("0x")); Serial.println(zahl, HEX);
Serial.println(F("ein Zahl in dec"));
Serial.print(F("0d")); Serial.println(zahl);
Serial.println(F("positiv Beispiele"));
if (zahl == 0x2341) Serial.println(F("True in hex")); else Serial.println(F("false in hex"));
if (zahl == 9025) Serial.println(F("True in dec")); else Serial.println(F("false in dec"));
Serial.println(F("negativ Beispiele"));
if (zahl == 0x42) Serial.println(F("True in hex")); else Serial.println(F("false in hex"));
if (zahl == 42) Serial.println(F("True in dec")); else Serial.println(F("false in dec"));
}
void loop() {
}
wenn du noch fragen hast, dann bringe ein kompilierbares Beispiel. Codefetzen schaue ich mir von dir nicht mehr an.