Forum: Mikrocontroller und Digitale Elektronik char in int umwandeln


von Felix (Gast)


Angehängte Dateien:

Lesenswert?

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!

von Sebastian R. (sebastian_r569)


Lesenswert?

atoi() oder atof()?

von Mark B. (markbrandis)


Lesenswert?

Ja, in der Regel kann man das mit der Funkion atoi() aus der 
Standard-Bibliothek erledigen.

http://www.cplusplus.com/reference/cstdlib/atoi/

von Adam P. (adamap)


Lesenswert?

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?

von Felix E. (felix1601)


Lesenswert?

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
von Mark B. (markbrandis)


Lesenswert?

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.

von Adam P. (adamap)


Lesenswert?

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?

von Felix E. (felix1601)


Lesenswert?

Dass ich ihn in einer Variable speichere

Danke für die Hilfe euch beiden!

von Dirk B. (dirkb2)


Lesenswert?

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.

von Felix E. (felix1601)


Lesenswert?

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?

von N. M. (mani)


Lesenswert?

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
von Felix E. (felix1601)


Lesenswert?

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!

von Felix E. (felix1601)


Lesenswert?

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?

von Dirk B. (dirkb2)


Lesenswert?

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
Noch kein Account? Hier anmelden.