Die Teilung einer durch Trennzeichen getrennte Zeichenfolge von Ganzzahlen
Mein hintergrund ist nicht in C (in Real Studio - ähnlich VB) und ich bin wirklich kämpfen, um split-Komma-getrennter string, seit ich ' m nicht verwendet, um low-level-string-handling.
Ich bin senden von Zeichenfolgen an einem Arduino über serial. Diese Saiten sind die Befehle in einem bestimmten format. Zum Beispiel:
@20,2000,5!
@10,423,0!
'@' ist der header, der angibt, einer neuen Kommando-und '!' ist die abschließende Fußzeile markiert das Ende eines Befehls. Die erste ganze Zahl nach dem '@' ist die Befehls-id und die restlichen ganzen zahlen-Daten (die Anzahl der zahlen übergeben, so können die Daten überall von 0 - 10 Ganzzahlen).
Ich geschrieben habe, eine Skizze, bekommt den Befehl (stripped von dem '@' und '!') und ruft eine Funktion namens handleCommand()
wenn ein Befehl zum handhaben. Das problem ist, ich weiß wirklich nicht, wie teilt diesen Befehl zu verarbeiten es!
Hier ist der sketch-code:
String command; //a string to hold the incoming command
boolean commandReceived = false; //whether the command has been received in full
void setup() {
//put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
//main loop
handleCommand();
}
void serialEvent(){
while (Serial.available()) {
//all we do is construct the incoming command to be handled in the main loop
//get the incoming byte from the serial stream
char incomingByte = (char)Serial.read();
if (incomingByte == '!')
{
//marks the end of a command
commandReceived = true;
return;
}
else if (incomingByte == '@')
{
//marks the start of a new command
command = "";
commandReceived = false;
return;
}
else
{
command += incomingByte;
return;
}
}
}
void handleCommand() {
if (!commandReceived) return; //no command to handle
//variables to hold the command id and the command data
int id;
int data[9];
//NOT SURE WHAT TO DO HERE!!
//flag that we've handled the command
commandReceived = false;
}
Sagen, mein PC sendet der Arduino die Zeichenfolge "@20,2000,5!". Meine Skizze endet mit einer String-Variablen (genannt command
), enthält "20,2000,5" und die commandRecieved
boolean-variable auf True gesetzt, damit die handleCommand()
- Funktion aufgerufen wird.
Was ich gerne tun würde: in der (momentan nutzlos) handleCommand()
Funktion zuordnen 20, um eine variable namens id
und 2000 und 5 auf ein Integer-array namens data
ich.e: data[0] = 2000
, data[1] = 5
usw.
Hab ich überlesen strtok()
und atoi()
aber ehrlich gesagt, ich bekomme einfach nicht meinen Kopf um Sie herum und das Konzept von Zeigern. Ich bin sicher, dass mein Arduino-sketch könnte optimiert werden, auch.
- diese 2 sind eine gute Methode, dies zu tun. Sie könnten auch versuchen, sscanf, wenn es verfügbar
- Konnte Sie Beispiel-code? Ich habe gekämpft, um kommen mit der C-code in der obigen Skizze. Ich weiß wirklich nicht, wie die beiden Methoden, die ich erwähnt...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da Sie mit der Arduino-core -
String
Typstrtok
und anderestring.h
Funktionen nicht geeignet sind. Beachten Sie, dass Sie kann ändern Sie Ihren code so verwenden Sie ein standard-C-null-terminierte " strings statt, sondern mit ArduinoString
lassen Sie dies tun, ohne die Verwendung von Zeigern.Den
String
Art gibt SieindexOf
undsubstring
.Vorausgesetzt wird ein String mit der
@
und!
abgestreift, finden Sie Ihren Befehl und Argumente würden in etwa so Aussehen:Dies wird Ihnen Ihre gesamte Befehl in der
data
- array aus, einschließlich der Befehl Anzahl andata[0]
, während Sie festgelegt haben, dass nur die Argumente sollten indata
. Aber die notwendigen änderungen sind geringfügig.scheint zu funktionieren, könnte buggy sein: