Hallo! ich muss für eine Diplomarbeit an meiner Schule (bin absoluter Einsteiger im Mikrocontroller programmieren!) aus einem MPU6050 Winkel x,y,z auslesen und auf einen MQTT Server hochladen. Diese werden dann in einem Topic published, und von einem anderen Mikrocontroller wieder ausgelesen aus diesem Topic. Nun kommen diese Nachrichten aber als String an und ich bräuchte aber wieder die Zahlenwerte! Gibt es hier einen command mit welchem ich das irgendwie umwandeln kann? Anbei mein bisheriger Sketch, der großteils auf dem MQTT ESP 8266 example der MQTT library besteht! Danke für jegliche Antworten!
Ja, in der Regel kann man das mit der Funkion atoi() aus der Standard-Bibliothek erledigen. http://www.cplusplus.com/reference/cstdlib/atoi/
Sebastian R. schrieb: > atoi() oder atof()? Würde ich auch sagen, falls dein String wirklich nur die Zahl enthält. Wie sieht der String aus, den du erhälst?
Also kann ich beispielsweise das so lösen: char char_angle_x[] = "100"; int angle_x= atoi(char_angle_x); Mein Gedanke: ich lese den String aus dem besagten Topic aus und definiere ihn. Dann eben mit atoi die Umwandlung und dann kann ich schon den Zahlenwert verwenden?
:
Bearbeitet durch User
Felix E. schrieb: > Also kann ich beispielsweise das so lösen: > > char char_angle_x[] = "100"; > int angle_x= atoi(char_angle_x); > > Mein Gedanke: > > ich lese den String aus dem besagten Topic aus und definiere ihn. Dann > eben mit atoi die Umwandlung und dann kann ich schon den Zahlenwert > verwenden? Sieht erstmal soweit sinnvoll aus. Genaueres hängt davon ab, in welchem Format die Daten vorliegen die Du bekommst.
Felix E. schrieb: > ich lese den String aus dem besagten Topic aus und definiere ihn Wie meinst du das? Wenn du ihn ausgelesen hast, was willst du dann noch definieren?
Du kannst auch einen Pointer auf den Anfang vom String übergeben. Wenn atoi ein Zeichen findet, dass nicht zu einer Dezimalzahl passt, hört es auf. Besser ist strtol, da man damit auch Fehler erkennen kann.
Danke für die zahlreichen Anworten! Nun habe ich noch ein Problem. Ich lade die Werte auf das Topic des MQTT Servers. Danach möchte ich das selbe Topic abonnieren und die Werte auslesen. Dazu brauche ich eben die atoi Funktion (wobei atoi in int umwandelt oder? ich denke float Werte wären besser..) um wieder Zahlenwerte zu erhalten. Durch "client.subscribe("Topic");" abonniere ich ja das Topic, aber wie kann ich mir dann die neuen Nachrichten im Serial Monitor anzeigen lassen, bzw. wie kann ich sagen, dass eine neue Nachricht sofort durch die atoi() Funktion laufen soll und anschließend in einer Variable gespeichert wird, die einfach immer bei einem neuen Wert überschrieben wird?
Laut Herr Internet kannst/musst du eine Callback Funktion angeben die bei einem Empfang aufgerufen wird:
1 | client.setCallback(callback); |
In ihr kannst du entweder die Zahl direkt zerlegen oder einfach nur sichern und in der Main in Ruhe. Je nach dem was deine Timinganforderungen besser erfüllt. EDIT: ich sehe gerade in deinen Code das du das bereits gemacht hast. Also nur noch nutzen. Ob float oder int liegt daran wie du deine Zahl überträgst. Das sehen hier wir nicht. Wie sieht denn der empfangene String aus?
:
Bearbeitet durch User
N. M. schrieb: > EDIT: ich sehe gerade in deinen Code das du das bereits gemacht hast. > Also nur noch nutzen. Ob float oder int liegt daran wie du deine Zahl > überträgst. Das sehen hier wir nicht. Wie sieht denn der empfangene > String aus? Kann ich noch nicht sagen, hatte noch keine Gelegenheit das zu probieren. Gebe heute Abend ein Update!
void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i = 0; i < length; i++) { atoi((char)payload[i]); Serial.print((char)payload[i]); } Serial.println(); } bei der atoi Zeile bekomme ich folgenden Fehler: invalid conversion from 'byte {aka unsigned char}' to 'const char*' [-fpermissive] Wie kann ich das ändern?
atoi möchte als Parameter ein C-String haben und gibt das Ergebnis als Rückgabewert zurück. Wenn die Payload nur aus dem Zahlenwert besteht reicht
1 | int wert; |
2 | |
3 | wert = atoi((char *)payload); |
Funktioniert auch bei atof, dann sollte wert aber vom Typ float (oder double) sein.
:
Bearbeitet durch User
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.