Ho giocato con la programmazione per arduino ma oggi ho trovato un problema che non riesco a risolvere con la mia conoscenza C molto limitata. Ecco come va. Sto creando un'applicazione per PC che invia l'input seriale all'arduino (deviceID, command, commandparameters). Questo arduino trasmetterà il comando su RF ad altri arduino. a seconda del deviceID, il comando arduino funzionerà correttamente.Split String in String array
Per essere in grado di determinare il deviceID voglio dividere quella stringa sul ",". questo è il mio problema, so come farlo facilmente in java (anche se non si usa la funzione split standard), tuttavia in C è una storia completamente diversa.
Qualcuno di voi ragazzi può dirmi come farlo funzionare?
grazie
/*
Serial Event example
When new serial data arrives, this sketch adds it to a String.
When a newline is received, the loop prints the string and
clears it.
A good test for this is to try it with a GPS receiver
that sends out NMEA 0183 sentences.
Created 9 May 2011
by Tom Igoe
This example code is in the public domain.
http://www.arduino.cc/en/Tutorial/SerialEvent
*/
String inputString; // a string to hold incoming data
boolean stringComplete = false; // whether the string is complete
String[] receivedData;
void setup() {
// initialize serial:
Serial.begin(9600);
// reserve 200 bytes for the inputString:
inputString.reserve(200);
}
void loop() {
// print the string when a newline arrives:
if (stringComplete) {
Serial.println(inputString);
// clear the string:
inputString = "";
stringComplete = false;
}
}
/*
SerialEvent occurs whenever a new data comes in the
hardware serial RX. This routine is run between each
time loop() runs, so using delay inside loop can delay
response. Multiple bytes of data may be available.
*/
void serialEvent() {
while (Serial.available()) {
// get the new byte:
char inChar = (char)Serial.read();
if (inChar == '\n') {
stringComplete = true;
}
// add it to the inputString:
if(stringComplete == false) {
inputString += inChar;
}
// if the incoming character is a newline, set a flag
// so the main loop can do something about it:
}
}
String[] splitCommand(String text, char splitChar) {
int splitCount = countSplitCharacters(text, splitChar);
String returnValue[splitCount];
int index = -1;
int index2;
for(int i = 0; i < splitCount - 1; i++) {
index = text.indexOf(splitChar, index + 1);
index2 = text.indexOf(splitChar, index + 1);
if(index2 < 0) index2 = text.length() - 1;
returnValue[i] = text.substring(index, index2);
}
return returnValue;
}
int countSplitCharacters(String text, char splitChar) {
int returnValue = 0;
int index = -1;
while (index > -1) {
index = text.indexOf(splitChar, index + 1);
if(index > -1) returnValue+=1;
}
return returnValue;
}
ho deciso che ho intenzione di usare la funzione strtok
. Sto correndo in un altro problema ora. L'errore che è successo è
SerialEvent.cpp: In function 'void splitCommand(String, char)':
SerialEvent:68: error: cannot convert 'String' to 'char*' for argument '1' to 'char* strtok(char*, const char*)'
SerialEvent:68: error: 'null' was not declared in this scope
codice è come,
String inputString; // a string to hold incoming data
void splitCommand(String text, char splitChar) {
String temp;
int index = -1;
int index2;
for(temp = strtok(text, splitChar); temp; temp = strtok(null, splitChar)) {
Serial.println(temp);
}
for(int i = 0; i < 3; i++) {
Serial.println(command[i]);
}
}
Osservare la funzione 'strtok()'. –
'strtok' è ammortizzato. usa 'strsep' invece – waspinator
Per riferimento futuro, AFAIK' strtok() 'è _not_ deprecato (o ammortizzato). Il compilatore MS Visual C++ lo segnala come annuncio non sicuro e alternativo, come fa GNU/POSIX (diverse alternative però). Utilizzato correttamente e con consapevolezza delle sue carenze, funzionerà come previsto. – Toby