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.
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.
}
}
}
é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 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