Récupérer la saisie de l'utilisateur dans une fonction

Bonjour !

Je souhaite récupérer la saisie de l'utilisateur de la console dans une fonction.
En gros j'ai une fonction qui récupère ce qui a été écrit dans la console et qui retourne le tout en string. Une sorte d'input quoi.

Le problème c'est que j'ai pas de problème pour lire ce qui a été écrit quand je suis dans la void loop() mais impossible de faire fonctionner le même script dans une fonction...

Voilà mon code:

String inputStr() 
{
 String str = "";
 while(Serial.available() <= 0) 
  {
      if(Serial.available() > 0)
      {
        str = Serial.readString();
        return(str);
      }
  }
}

Merci beaucoup de votre aide !!

Si vous voulez écouter le port série (ou gérer un flux asynchrone genre keypad) vous pouvez jeter un oeil à mon petit tuto sur le sujet

En regardant votre tuto je retombe sur des choses que j'avais déjà essayé sans succès me^me en modifiant mon code comme cela:

String inputStr() 
{
  String r;
  while (Serial.available()) {
    r = Serial.read();
  }
  return(r);
}

Cela ne fonctionne toujours pas...
Arduino lit une string vide et ne check seulement une seule fois si quelque chose est rentré par l'utilisateur. Alors qu'avec la while il devrait rechercher continuellement...

Bonjour,

Il suffit de tester si tu as reçu une chaine de caractères dans ta fonction et de ne retourner que si tu as reçu une chaine.

String inputStr()
{
  String str;
  while (str.length()==0)
  {
    str = Serial.readString();
  }
  return str;
}

Cependant cette manière de faire pose problèmes

  • ton programme est bloqué tant que tu n'as pas reçu ta chaine
  • il faut éviter d'utiliser la class String qui provoque de la fragmentation mémoire

Ca marche pas non plus l'Arduino ne lis rien... Il y aurait une autre façon de faire ?

Ca doit fonctionner. Met ton programme

Bonjour tsonea

Voilà une façon de faire (Moniteur à 115200).


//------------------------------------- Ligne de commandes
bool cmdNouvelleRecue = false;      // Si une nouvelle commande a été reçue
String cmdTexte = "";               // Texte de la commande

void setup()
{
	Serial.begin(115200);
	Serial.setTimeout(50);
}


void loop()
{
	serialInput();     // Ecouter la console          

	if (cmdNouvelleRecue)      // Si une nouvelle commande depuis la console
	{
		cmdExecute(cmdTexte);
		
		cmdTexte = "";
		cmdNouvelleRecue = false;
	}
}

void cmdExecute(String commande)
{
	Serial.println("Execution de " + commande);
}

/*-----------------------------------------------------------------------
  Réception de commandes depuis le moniteur
'*------------------------------------------------------------------------
*/
void serialInput()                                       
{
  if (Serial.available())
  {
	  cmdTexte = Serial.readString();
	  
	  cmdTexte.replace("\n", "");     // Nettoyer l'entrée
	  cmdTexte.replace("\r", "");
	  
	  cmdNouvelleRecue  = true;
  }
}

Mais il faut savoir, que, dans le moniteur, tu ne peux pas saisir la saisie de l'opérateur "à la volée", la saisie doit obligatoirement se terminer avec un Enter au clavier.

Cordialement
jpbbricole

Il y a un code tout fait qui vous prévient quand le séparateur est reçu

Ensuite tout dépend de comment votre code est organisé …