Je suis très nouveau dans la programmation Arduino. Jessaie didentifier la chaîne dentrée du moniteur série et dimprimer la sortie sur la console en conséquence
Le code est:
void setup() { Serial.begin(9600); } void loop() { while (Serial.available() > 0 ) { String str = Serial.readString(); if (str.equals("send")) { Serial.println("identified"); } else { Serial.println("unknown"); } } }
Chaque fois que je mettre la chaîne denvoi, il montre « inconnu » comme sortie, ce qui est faux, et je devrais être « identifié » comme sortie. Quelquun peut-il me guider ici pour obtenir le résultat.
Remarque: jobtiens la sortie comme je le voulais en utilisant la fonction readStringUntil mais les chaînes ont beaucoup de « . » dedans, donc pas utile.
Commentaires
Réponse
Si vous définissez la ligne de votre moniteur série se terminant par « Both NL & CR », alors ce code trouvera le mot « send ». Il ne trouvera PAS le mot « send » dans cette chaîne, « ssend » ou dans cette chaîne, « sendd ».
void setup(){ Serial.begin(9600); } void loop(){ while(Serial.available() > 0 ){ String str = Serial.readString(); if(str.substring(0) == "send\r\n"){ Serial.println("identified");} else{ Serial.println("unknown"); } } }
Si vous voulez trouver la chaîne « send » dans « 1234send » ou « send1234 » ou « 1234send5678 » puis utilisez indexOf ();
void setup(){ Serial.begin(9600); } void loop(){ while(Serial.available() > 0 ){ String str = Serial.readString(); if(str.indexOf("send") > -1){ Serial.println("identified");} else{ Serial.println("unknown"); } } }
Answer
Il y a un certain nombre de raisons pour lesquelles le test * .equals est faux. Tenez compte des différences de casse ou des caractères supplémentaires introduits à partir de la source de vos communications. Même les caractères non imprimables peuvent poser un problème et entraîner léchec du test.
Pensez à utiliser * .substring () à la place. Cette méthode renvoie true si la sous-chaîne est trouvée. Par exemple:
String stringOne = "12345 send 1234"; // substring(index) looks for the substring from the index position to the end: if (stringOne.substring(0) == "send") { Serial.println("identified"); } else { Serial.println("unknown"); }
… devrait toujours renvoie « identifié » car les caractères « s », « e », « n » et « d » se trouvent dans la séquence correcte dans la chaîne stringOne.
Commentaires
- String str = Serial.readString (); if (str.substring (0) == " send ") Serial.println (" identifié "); else Serial.println (" inconnu "); cela na même pas fonctionné.
- Odd. Avez-vous regardé le lien vers la page Web pour vous assurer que vous utilisiez correctement la sous-chaîne? ( Cette page Web? ). De plus, je vois dans les commentaires que vous lavez imprimé la chaîne reçue et que vous avez vu " envoyer " dans le message reçu, correct? Vous pouvez simplement mettre en commentaire la ligne de lecture en série et essayer dutiliser " String str = " 12345 send 1234 "; " pour tester si tout fonctionne. À la recherche dautres commentaires, vous pouvez rapidement essayer denvoyer (taper) " space " + " envoyer " + " espace " (" envoyez ") pour voir si cela fonctionne.
- Cela na pas fonctionné '. substring (n) renvoie simplement la partie de la chaîne commençant à la position n. Ainsi, substring (0) renvoie simplement une copie de la chaîne. str.substring (0,4) renverra les 4 premiers caractères de la chaîne (en supposant quil y ait au moins 4 caractères à renvoyer – Je ' ne suis pas assez familier avec cette implémentation pour savoir quoi cest le cas pour une chaîne plus courte – C # lèverait une exception).
Réponse
void setup() { Serial.begin(9600); } void loop() { char inChar[5]; if(Serial.available() > 0 ) { for (int i=0; i<5; i++) { inChar[i] = Serial.read(); delay(10); } if (inChar[0] == "s" && inChar[1] == "e" \ && inChar[2] == "n" \ && inChar[3] == "d") { Serial.println("identified"); } else { Serial.println("unknown"); } } }
Commentaires
- Lecture de la chaîne " send " utiliser la commande Serial.readString () est très bien. Mais dune manière ou dune autre, cela ne fonctionnera pas si vous utilisez le résultat pour comparer (par exemple data == " send " …). Une solution possible est dutiliser un tableau de caractères (par exemple inChar [5]). La taille du tableau est supérieure de 1 au nombre maximum de caractères requis.
\r\n
pas/r/n
…