Probleme Avec Serial.readStringUntil('\n');

Bonjour,

Je suis actuellement en train de développer un code me permettant de tester des dispositif en entrant des commande dans le moniteur série. le but est de piloter des multiplexeur, l’Arduino n'étant la que pour lire les commande entrées. Ayant commencé mon développement sur tinkercad, je me retrouve coincé lorsque je le téléverse sur l'IDE.

Je tiens a préciser que je suis loin de maîtriser le langage de programmation Arduino mais que sur tinkercad le programme fonctionne parfaitement. Voici le Programme :

#include <stdio.h>
#include <string.h>

#define LMIN 2
#define LMAX 3
#define SIMU 4
#define EPNO 5
#define EPNF 6
#define EDNF 7
#define DGNO 8
#define DGNF 9
#define POIDS1 10
#define POIDS2 11
#define POIDS3 12
#define coup 13
#define FREQ A1


char Cmde[9];
  //On definie le tableau de caractere Cmde.
char text[7];
  //On definie le tableau de caractere text.
int aT;
int bT;
int cT;
int dT;
int ValDELAY;
int bP;
int cP;
int dP;


void setup() {

 Serial.begin(9600);
 pinMode(LMIN, OUTPUT);
 pinMode(LMAX, OUTPUT);
 pinMode(SIMU, OUTPUT);
 pinMode(EPNO, INPUT);
 pinMode(EPNF, INPUT);
 pinMode(EDNF, INPUT);
 pinMode(DGNO, INPUT);
 pinMode(DGNF, INPUT); 
 pinMode(FREQ, INPUT);
 pinMode(POIDS1, OUTPUT);
 pinMode(POIDS2, OUTPUT);
 pinMode(POIDS3, OUTPUT); 
 pinMode(coup, OUTPUT);

}

void loop() {
  
  
while (Serial.available()==0){}

	String Saisi = Serial.readStringUntil('\n');
    Saisi.toCharArray(Cmde, 9);
         // Permet de convertir la String Saisi sous forme de Char.
    scanf("%s", Cmde);
    Serial.println(Cmde);
        // identification de la Commande.
  
   switch (Cmde[0])
    { 
     case 'T':         //Cmde commence par T
        aT = Cmde[4]-48;
        bT = Cmde[5]-48;
        cT = Cmde[6]-48;
        dT = Cmde[7]-48;
        ValDELAY = aT*1000+bT*100+cT*10+dT;
        Serial.print("Le Delay vaudra : ");
        Serial.println(ValDELAY);
     break;
     
        case 'V':          // Cmde commence par V
     	   bP = Cmde[4]-48;  // Val POIDS3
 		if (bP == 1){
   		   digitalWrite(POIDS3, HIGH);}
 		if (bP == 0){
    	           digitalWrite(POIDS3, LOW);}
	    cP = Cmde[5]-48; // Val POIDS2
 		if (cP == 1){
   		   digitalWrite(POIDS2, HIGH);}
 		if (cP == 0){
    	           digitalWrite(POIDS2, LOW);}
            dP = Cmde[6]-48; // Val POIDS1
 	        if (dP == 1){
   		   digitalWrite(POIDS1, HIGH);}
 	        if (dP == 0){
    	           digitalWrite(POIDS1, LOW);}

            Serial.print("la Boucle Selectionnee est : ");
            Serial.print(bP);
            Serial.print(cP);
            Serial.println(dP);
        break;
     
     case 'L':         // Cmde commence par L
        switch(Cmde[2]){
             case 'A': // le 3eme caractere est A soit LMAXI
                 digitalWrite(LMIN, HIGH);
                 digitalWrite(coup, LOW);
    	         digitalWrite(LMAX, LOW);
   	         digitalWrite(SIMU, HIGH);
   		 Serial.println("FMAXI mis en place");
             break;
       
   	     case 'I':         // le 3eme caractere est I soit LMINI
      	        digitalWrite(LMIN, LOW);
                digitalWrite(coup, LOW);
    	        digitalWrite(LMAX, LOW); 
    	        digitalWrite(SIMU, HIGH);
  	        Serial.println("FMINI mis en place");
            break;
       
            case 'Y': // le 3eme caractere est Y soit LTYPE
                digitalWrite(LMIN, LOW);
       	digitalWrite(coup, LOW);
   		digitalWrite(LMAX, HIGH);
     	        digitalWrite(SIMU, HIGH);       	  
     	        Serial.println("FTYPE mis en pLace");
            break;}
     
            case 'S':
   	  	 if(!strcmp(Cmde, "SIMU1"))  
    	            {
      	               digitalWrite(SIMU, LOW);
                       Serial.println("Inductance SIMU Prise en compte");
    	             }
   	        if(!strcmp(Cmde, "SIMU0"))  
    	            {
      	               digitalWrite(SIMU, HIGH);
                	Serial.println("Inductance SIMU PAS Prise en compte");
       	     }
   	   break;
     
           case 'C':
      	        digitalWrite(coup, HIGH);
                Serial.println("Relai coup actif");
    	   break;
      }

  if (Cmde[0]!='T'){
      delay(ValDELAY);

int text[]={analogRead(FREQ),digitalRead(EPNO),digitalRead(EPNF),digitalRead(EDNF),digitalRead(DGNF), digitalRead(DGNO)}; 

  // Permet d'assembler une Trame.
    
    Serial.print(bP);
    Serial.print(cP);
    Serial.print(dP);
  
  Serial.print(";");
  
    if (text[0]<1000)
     {
      Serial.print("0"); 
      }
    if (text[0]<100)
     {
      Serial.print("0");
      }
    if (text[0]<10)
     {
      Serial.print("0");
      }
    Serial.print(text[0]);
    Serial.print(";");
  
    for(int i=1; i<=5; i++)
    {
      Serial.print(text[i]);
      Serial.print(";");
     }
    Serial.println(text[5]);
   }
}

Au cas ou vous voudriez tester le code par vous-même, les commandes sont :
-TEMPxxxx (le x représente un chiffre quelconque par exemple: TEMP0500, le délai vaudra 500ms)
-VOIExxx ( ici le x prend la valeur de 1 ou 0 il s'agit de binaire)
-LMINI
-LMAXI
-LTYPE
-SIMU1
-SIMU0
-COUP

Pour toute question n’hésiter pas à les poser. Merci d'avoir pris le temps de lire mon message.

ceci n'est pas top (vous bloquez la loop, readStringUntil peut avoir un timeout, il faut que la console soit bien réglée....)

Si vous voulez explorer comment écouter le port série vous pouvez jeter un oeil à mon petit tuto sur le sujet

--

si ça ne marche pas sur votre Arduino avec le console série, vérifiez que vous envoyez LF en fin de commande dans le terminal série

Tout d'abord merci de cette réponse rapide cependant que voulez vous dire par "LF". Merci d'avance.

line feed, en français "Nouvelle Ligne"

comme votre code demande à lire jusqu'à la réception d'un '\n', il serait bien qu'il soit envoyé

ça se règle dans le moniteur série en bas, vous dites ce qui doit être envoyé après le texte tapé par l'utilisateur quand il valide avec entrée

image

1 Like

encore merci, je vais essayer avec votre tuto. Bonne journée

Rebonjour,

Juste pour vous dire que votre aide ma été très précieuse et que grâce a vous j'ai réussi a régler le problème. Bonne journee

parfait - bonne continuation !

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.