Split String dans un tableau de chaînes
J'ai été jouer avec la programmation pour arduino, mais aujourd'hui j'ai rencontré un problème que je n'arrive pas à résoudre avec mon très limitée C la connaissance.
Voici comment ça se passe.
Je suis de la création d'une application pc qui envoie série d'entrée de l'arduino (deviceID, commande, commandparameters). Ce arduino transmettre cette commande RF à d'autres arduino. en fonction de l'id correct arduino sera exécuter la commande.
Pour être en mesure de déterminer le deviceID je veux briser cette chaîne ",".
c'est mon problème, je sais comment le faire facilement en java (même en n'utilisant pas le standard de la fonction de répartition), cependant, en C c'est une histoire totalement différente.
Qui de vous les gars me dire comment le faire fonctionner?
grâce
/*
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;
}
J'ai décidé, je vais utiliser le strtok
fonction.
Je suis en cours d'exécution dans un autre problème maintenant. L'erreur qui s'est passé est
SerialEvent.cpp: In function 'void splitCommand(String, char)':
SerialEvent:68: erreur: impossible de convertir de 'Chaîne' to 'char*' for argument '1' to 'char* strtok(char*, const char*)'
SerialEvent:68: erreur: 'null', n'a pas été déclarée dans ce cadre
Code, c'est comme,
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]);
}
}
source d'informationauteur NightWalker
Vous devez vous connecter pour publier un commentaire.
C'est une vieille question, mais j'ai créé un morceau de code qui peut les aider:
Cette fonction renvoie une chaîne unique séparés par un caractère prédéfini à un index donné. Par exemple:
Doit imprimer "est". Vous pouvez aussi essayer avec l'index 0 de retour "salut" ou, en toute sécurité essayant index 5 le retour de "test".
Espérons que cette aide!
Mise en œuvre:
Résultat:
Pour l'allocation dynamique de mémoire, vous aurez besoin d'utiliser malloc, c'est à dire:
Vous aurez besoin également de la longueur maximale de la chaîne.
La
C
façon de découper une chaîne de caractères en fonction d'un caractère délimiteur est d'utiliserstrtok
(oustrtok_r
).Voir aussi cette question.
Je pense que votre idée est un bon point de départ. Voici un code que j'utilise (pour analyser HTTP GET RESTE demandes avec un Ethernet shield).
L'idée est d'utiliser une boucle while et lastIndexOf et stocker les chaînes dans un tableau (mais vous pouvez faire autre chose).
"demande" est la chaîne que vous souhaitez analyser (pour moi c'était appelée demande parce que.. c'était).
J'ai utilisé ce code avec succès, mais je chose leur est un encodage problème lorsque j'essaie d'imprimer params[x]... je suis alos un débutant donc je ne maîtrise pas les caractères vs chaine...
Espère que cela aide.