He estado jugando con la programación de Arduino, pero hoy he encontrado un problema que no puedo resolver con mi muy limitado conocimiento de C. Así es como funciona. Estoy creando una aplicación para PC que envía una entrada en serie al arduino (deviceID, command, commandparameters). Este arduino transmitirá ese comando por RF a otros Arduino. dependiendo del deviceID, el Arduino correcto ejecutará el comando.Split String en String array
Para poder determinar el deviceID quiero dividir esa cadena en el ",". este es mi problema, sé cómo hacerlo fácilmente en Java (incluso al no usar la función de división estándar), sin embargo, en C es una historia totalmente diferente.
¿Alguno de ustedes me puede decir cómo hacerlo funcionar?
gracias
/*
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;
}
yo hemos decidido que voy a utilizar la función de strtok
. Me encuentro con otro problema ahora. El error ocurrió es
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
Código es como,
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]);
}
}
Mire la función 'strtok()'. –
'strtok' está depreciado. use 'strsep' en su lugar – waspinator
Para referencia futura, AFAIK' strtok() 'no _ está en desuso (o depreciado). El compilador de MS Visual C++ lo marca como anuncios inseguros y alternativos, al igual que GNU/POSIX (aunque con alternativas diferentes). Utilizado correctamente y teniendo en cuenta sus deficiencias, funcionará según lo previsto. – Toby