Arduino (C-Sprache) - parsing-string-mit-Trennzeichen (Eingabe über die serielle Schnittstelle)
Arduino (C-Sprache) - parsing-string-mit-Trennzeichen (Eingabe über die serielle Schnittstelle)
Nicht die Antwort finden Sie hier :/
Will ich senden meinen arduino über eine serielle Schnittstelle (Serial.read()) eine einfache Zeichenfolge von drei Ziffern, getrennt mit Komma. Diese drei zahlen werden konnten, von 0-255.
ZB.
255,255,255
0,0,0
1,20,100
90,200,3
Was ich tun müssen, ist zum Parsen dieses Strings gesendet, um arduino zu drei Ganzzahlen, die (sagen wir r, g und b).
Also, wenn ich senden
100,50,30
arduino übersetzt es zu
int r = 100
int g = 50
int b = 30
Ich versuchte viele codes, aber keiner von Ihnen arbeitete. Das Hauptproblem ist, zu übersetzen string (Haufen chars) auf integer. Ich habe herausgefunden, daß es wohl strtok_r für Trennzeichen Zweck, aber das ist über es.
Vielen Dank für alle Vorschläge 🙂
- atoi in eine Zahl
- so, es aufgeteilt, die durch Kommas und dann atoi jedes bit
- Warum sich die Mühe gehen durch strings? Senden Sie einfach drei bytes mit den entsprechenden Werten.
- Wenn Sie die Steuerung der orginal gesendete Inhalte, anstatt das versenden von strings, warum nicht einfach senden 3 Byte? Dann keine Analyse oder Kommas benötigt.
- Speichern Sie das Byte in ein unsigned char[], dann können Sie leicht Zugang zu Ihnen.
- Können Sie Ihre Idee für eine Antwort? Würde gerne sehen, wie das aussieht, da ich versuche, die RGB-Werte und möchte mit BYTES anstelle von STRING, da es nimmt viel Platz ein und im mit ein ATTINY85.
- Können Sie Ihre Idee für eine Antwort? Würde gerne sehen, wie das aussieht, da ich versuche, die RGB-Werte und möchte mit BYTES anstelle von STRING, da es nimmt viel Platz ein und im mit ein ATTINY85.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Antwort auf die Frage, die Sie fragte, String-Objekte sind sehr mächtig und Sie können genau das tun, was Sie Fragen. Wenn Sie beschränken Sie Ihre parsing-Regeln direkt aus der Eingabe Ihres Codes wird weniger flexibel, weniger wiederverwendbar und leicht gewunden.
Strings haben die Methode indexOf (), die Ihnen erlaubt zu suchen für den index in der Zeichenkette das Zeichen-array von einem bestimmten Charakter. Wenn das Zeichen nicht gefunden wird, soll die Methode -1 zurückgeben. Ein zweiter parameter Hinzugefügt werden können, um die Funktion Aufruf, um einen Ausgangspunkt für die Suche. In Ihrem Fall, da Sie Ihre Trennzeichen sind Kommas, würden Sie rufen:
Dann können Sie diesen index zu erstellen, der ein Teilstring mit der String-Klasse die Methode substring (). Dies gibt Sie eine neue Zeichenfolge an einer bestimmten Indexposition, und endet direkt vor einem zweiten index (Oder das Ende der Datei, wenn keine angegeben ist). So würde Sie geben so etwas wie:
Schließlich, die integer-Werte können abgerufen werden, mithilfe der String-Klasse undokumentierte Methode toInt():
Mehr Informationen über das String-Objekt und die verschiedenen Methoden gefunden werden kann int die Arduino Dokumentation.
thirdValue
wird immer 0 zurück.String thirdValue = payload.substring(secondCommaIndex+1);
Verwenden
sscanf
;Verwenden Sie mein code hier, wenn Sie wollen, um zu analysieren, ein Strom des string-ex:
255,255,255 0,0,0 1,20,100 90,200,3
Parsing-Funktion für die Komma-getrennten stringIch denke, Sie wollen etwas tun, wie das Lesen in den Daten:
Dann benutzen Sie atoi (), die Daten zu konvertieren Ganzzahlen und verwenden Sie Sie.
Das ist großartig!
Den letzten Kommentar über "thirdvalue = 0" wahr ist, von den angegebenen code in die von Ihnen positiv bewertet werden Antwort von @dsnettleton. Jedoch, anstelle von "lastIndexOf(',');" , sollte der code fügen Sie einfach ein "+1" bis "secondCommaIndex" wie @dsnettleton richtig haben für commaIndex+1 (fehlende +1 ist wahrscheinlich nur ein Tippfehler von dem Kerl).
Hier ist die aktualisierte Codeabschnitt
Beispiel)
Für eine myString = "1,2,3"
Hinweis: nicht zu verwechseln mit der INDEX mit der LÄNGE der Zeichenfolge. Die Länge der Zeichenfolge ist 5. Da der String indexOf zählt ab 0, der Letzte index ist 4.
Der Grund, warum nur
gibt 0 zurück, wenn mit .toInt() ist da thirdValue = ",3" und nicht "3", welche Schrauben bis toInt().
ps. leider schreiben alle Anweisungen aus, sondern wie ein mech eng, selbst ich manchmal möchte, dass jemand auf dumme down code für mich vor allem, nachdem in der Beratung für die letzten 7 Jahre. Halten Sie sich die großartige posting! Hilft Leuten wie mir eine Menge!
Einfachsten, denke ich, ist mit
parseInt()
um diese Aufgabe zu erfüllen:funktioniert der trick.
Für n-Nummer mit Trennzeichen im string
@cstrutton -Ausgezeichnete Vorschlag auf, mit 'indexOf' . es ersparte mir eine Menge Zeit für mein Projekt. Ein kleiner Zeiger, obwohl,
Bemerkte ich, dass die thirdvalue nicht angezeigt bekommen (war wieder als NULL). Auf mit ihm spielen wenig wenig und gehen durch den doc an http://arduino.cc/en/Tutorial/StringIndexOf
Ich erkannte, dass ich kann verwenden lastIndexOf für den letzten Wert.
Hier sind zwei Zeilen von Modifikationen, die richtige Dritte Wert.