probleme Serial.readString

voila dans l'esprit d'apprendre je m'essaie au moniteur série
mon souci je voudrais contrôler une commande via le moniteur série

mais quand je tape cont1-1 ou cont1-0 rien ne s'affiche
vous auriez des idées du pourquoi ?

String monitserie = "";
void setup() {

  Serial.begin(9600);

}

void loop() {

  if (Serial.available())
  {
    monitserie = Serial.readString();
    if (monitserie == "cont1-1")
      Serial.print("cont1-1");
    else if (monitserie == "cont1-0")
      Serial.print("cont1-0");
  }
}

Bonsoir Julesperdu

Julesperdu:
mon souci je voudrais contrôler une commande via le moniteur série

Pour moi c'est essentiel de maîtriser cette technique, à peu près tout mes programme comprennent des introductions au moniteur ou depuis d'autres systèmes via un port COM.

Ton problème provient du fait que quand tu introduit une chaîne dans le moniteur, dépendant de sa configuration, au moment du Enter, il ajoute 1 voire 2 caractères cachée \n (Lf 0xA) \r (Cr 0xD). Dans ma configuration j'envoie les 2 (Cr et Lf).
Lors de la comparaison == il sont pris en compte.

Le code corrigé:

String monitserie = "";
void setup() {

 Serial.begin(9600);

}

void loop() {

 if (Serial.available())
 {
 monitserie = Serial.readString();
 int nbCaract =  monitserie.length();
 monitserie = monitserie.substring(0, nbCaract-2);   // Pour supprimer les caractères cachée \n (Lf 0xA)  \r (Cr 0xD)

 if (monitserie == "cont1-1")
 Serial.println("recu cont1-1");
 else if (monitserie =="cont1-0")
 Serial.println("recu cont1-0");
 }
}

PS:je préfère la méthode serial.read, en mode caractère, ça me permet d'éliminer les indésirables.

Bonne soirée
Cordialement
jpbbricole

Bonjour

Je vous mets ma méthode pour lire les ports série par caractères, méthode Serial.read()

//------------------------------------- Tool Input monitor Serial
String monCommandRx;                                                 // Chaine recue
boolean monCommandNew;                                               // Flag nouvelle chaine recue


void setup()
{
	Serial.begin(9600);
}

void loop()
{
	/*---------------------------------------------------------------------------------------------------------------------- 
	   Ecoute du moniteur série pour la réception éventuelle d'une commande.
	  ----------------------------------------------------------------------------------------------------------------------
	*/
	//serialEvent();                                                 // Voir void serialEvent()
	if (monCommandNew)                                               // Si reçu une nouvelle commande
	{
		monitCmdRecue(monCommandRx);
		
		monCommandRx = "";                                           // On vide la chaine recue
		monCommandNew  = false;                                      // On reset le flag de nouvelle réception
	}
}

void monitCmdRecue(String commandeRecue)
{
	Serial.println("Commande recue \t" + commandeRecue);
}
	
//===================================== Port série
/*-------------------------------------------------------------------------------------------------
	Lecture du port série en mode interruption sauf Leonardo, Micro et proc ATmega32U4
	https://www.arduino.cc/en/Tutorial/SerialEvent
	La void doit s'appeler serialEvent (serialEvent1() serialEvent2() serialEvent3() Mega)
'--------------------------------------------------------------------------------------------------
*/
void serialEvent()                                                   // Moniteur de l'IDE
{
	while (Serial.available())
	{
		char monChar = (char)Serial.read();                          // Char received from IDE monitor
		if (monChar == '\n')                                         // Si caractère Nouvelle Ligne (Lf 0xA ou 10)
		{
			monCommandNew  = true;                                   // Flag de nouvelle chaine recue
		}
		else
		{
			if (monChar >= ' ') {monCommandRx += monChar;}           // >= ' ' pour supprimer tout les caractères < que espace.
		}
	}
}

Cordialement
jpbbricole

éventuellement - si vous voulez comprendre comment bien écouter le port série (ou gérer un flux asynchrone genre keypad) vous pouvez jeter un oeil à mon petit tuto sur le sujet

sur un petit micro-controleur j'éviterais aussi d'utiliser la classe String si votre projet doit fonctionner dans la durée

merci a tous pour vos réponses

merci jpbbricole pour votre programme qui correspond bien a ce que je voulais faire

J-M-L:
sur un petit micro-controleur j'éviterais aussi d'utiliser la classe String si votre projet doit fonctionner dans la durée

quels sont les risques car oui en effet je voudrais le faire tourner avec une carte nano,car par la suite je voudrais la faire communiquer avec un raspberry

Un peu de lecture The Evils of Arduino Strings