Opération Arduino Uno Serial.readString () très basique

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

  • quel est votre paramètre de fin de ligne dans Serial Monitor?
  • à la fois NL et CR.
  • puis recherchez " send / r / n "
  • Vous voulez dire \r\n pas /r/n
  • Le problème avec lutilisation déléments comme readString est que vous ne faites vraiment pas ' Je ne sais pas ce quils font ni comment ils fonctionnent. Analysez manuellement les données entrantes pour savoir avec quoi vous travaillez.

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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *