Ich sende eine Liste von Servopositionen über die serielle Verbindung an den Arduino im folgenden Format
1:90&2:80&3:180
Welches würde analysiert werden als:
servoId : Position & servoId : Position & servoId : Position
Wie würde ich diese Werte aufteilen und in eine Ganzzahl konvertieren?
serial
arduino-mega
string
ValrikRobot
quelle
quelle
Antworten:
Im Gegensatz zu anderen Antworten halte ich mich aus
String
folgenden Gründen lieber fern :In einer eingebetteten Umgebung wie Arduino (selbst für ein Mega mit mehr SRAM) würde ich lieber Standard-C-Funktionen verwenden :
strchr()
: Suche nach einem Zeichen in einer C-Zeichenfolge (dhchar *
)strtok()
: Teilt eine C-Zeichenfolge basierend auf einem Trennzeichen in Teilzeichenfolgen aufatoi()
: konvertiert einen C-String in einenint
Das würde zu dem folgenden Codebeispiel führen:
Der Vorteil hierbei ist, dass keine dynamische Speicherzuordnung stattfindet; Sie können sogar
input
eine lokale Variable in einer Funktion deklarieren , die die Befehle liest und ausführt. Sobald die Funktion zurückgegeben wird, wird die voninput
(im Stapel) belegte Größe wiederhergestellt.quelle
Diese Funktion kann verwendet werden, um eine Zeichenfolge basierend auf dem Trennzeichen in Teile zu trennen.
String in int konvertieren
Dieser Codeabschnitt nimmt eine Zeichenfolge und trennt sie basierend auf einem bestimmten Zeichen und gibt das Element zwischen den Trennzeichen zurück
quelle
Sie könnten etwas wie das Folgende tun, aber bitte berücksichtigen Sie einige Dinge:
Wenn Sie verwenden
readStringUntil()
, wird gewartet, bis das Zeichen oder die Zeitüberschreitungen empfangen werden. Mit Ihrer aktuellen Zeichenfolge dauert die letzte Position also etwas länger, da sie warten muss. Sie können ein Trailing hinzufügen&
, um diese Zeitüberschreitung zu vermeiden. Sie können dieses Verhalten problemlos in Ihrem Monitor überprüfen, versuchen, den String mit und ohne Zusatz zu senden,&
und es wird eine solche Zeitüberschreitungsverzögerung angezeigt.Sie brauchen eigentlich nicht den Servo - Index, können Sie Ihre Reihe von Positionen nur senden, und den Servoindex durch die Wertposition in der Zeichenfolge bekommen, so etwas wie:
90&80&180&
. Wenn Sie den Servoindex verwenden, möchten Sie ihn möglicherweise überprüfen (inint
den Schleifenindex i konvertieren und ihn dann abgleichen), um sicherzustellen, dass mit Ihrer Nachricht nichts schief gelaufen ist.Sie müssen sicherstellen, dass der zurückgegebene String von
readStringUntil
nicht leer ist. Wenn bei der Funktion eine Zeitüberschreitung auftritt, haben Sie nicht genügend Daten erhalten. Daher führt jeder Versuch, Ihreint
Werte zu extrahieren , zu merkwürdigen Ergebnissen.quelle
Sie können
Stream.readStringUntil(terminator)
für jeden Teil einen anderen Abschluss verwenden.Auf jeden Teil rufst du dann an
String.toInt
quelle
Die einfachste Lösung ist die Verwendung von sscanf () .
Dies ergibt folgende Ausgabe:
Prost!
quelle
invalid conversion from 'int' to 'char*' [-fpermissive]
Siehe Beispiel unter: https://github.com/BenTommyE/Arduino_getStringPartByNr
quelle
quelle
jfpoilpret lieferte eine großartige Antwort für das Parsen von seriellen Befehlen auf Arduino. Attiny85 hat jedoch keine bidirektionale Seriennummer - SoftwareSerial muss verwendet werden. So portieren Sie denselben Code für Attiny85
Attiny85-Schaltpläne für PIN-Nummern
Skizze kompiliert in:
Es gibt also viel Platz und Speicher für den Rest des Codes
quelle
Arduino
Schlüsselwörter und geraten manchmal in sehr schwierige Situationen, da das Implementieren von Arduino-Code auf Attiny nicht immer trivial ist. Musste den Originalcode konvertieren, um mit Attiny zu arbeiten, testete ihn und entschied sich, ihn zu teilenquelle
quelle
Hier ist die Arduino- Methode, um eine Zeichenfolge als Antwort auf die Frage "Wie wird eine Zeichenfolge in Teilzeichenfolgen aufgeteilt?" als Duplikat der vorliegenden Frage deklariert.
Das Ziel der Lösung besteht darin, eine Reihe von GPS- Positionen zu analysieren, die in einer SD-Kartendatei gespeichert sind. Anstatt einen String empfangen zu lassen
Serial
, wird der String aus einer Datei gelesen.Die Funktion
StringSplit()
parst einen StringsLine = "1.12345,4.56789,hello"
in 3 StringssParams[0]="1.12345"
,sParams[1]="4.56789"
&sParams[2]="hello"
.String sInput
: die zu analysierenden Eingabezeilen,char cDelim
: das Trennzeichen zwischen den Parametern,String sParams[]
: das Ausgabearray von Parametern,int iMaxParams
: die maximale Anzahl von Parametern,int
: die Anzahl der analysierten Parameter,Die Funktion basiert auf
String::indexOf()
undString::substring()
:Und die Bedienung ist denkbar einfach:
quelle