Arduino Mega gestion des port serie !!!

Bonjour tous,

Suite à de multiple essaie de reconnaissance de string pour allumer ou éteindre une LED , sur 2 ports serie sur Nano l'un en software et l'autre en hard le résultat est d'une lenteur par possible et bien sur très instable !!!

Donc mon choix vas aller vers un Mega pour ces multiple Uart !!!

Je ne l'ai pas encore commander mais ma demande est de savoir si la gestion se fait sans blocage du µP ou la gestion des Uart sera aussi lente et bloquante ???

Merci du retour de vos expérience :wink:

Le problème, c'est pas le nano.
C'est plutôt ton code ou ton montage.

La réponse est dans l'autre fil de discussion que tu as ouvert.
Tu utilises des fonctions de lecture bloquantes le fait que se soit des liaisons série hard ou soft n'y changera pas grand chose.

Donc si je comprend bien vos réponse la lecture sur un port série est toujours une fonction bloquante ??

j'ai essaye d'autre façon de faire la lecture et même problème !!!

par example ceci:

void setup() {
    Serial.begin(9600);
    pinMode(13,OUTPUT);
    digitalWrite(13,LOW);
}
 
String serialCommand;
char serialLetter;
 
void loop()
{
     
    serialCommand = "";
 
    // Boucle infinie (que l'on quitte lorsque l'on appuis sur la touche ENTER)
    for (;;) {
         
        // Si la com reçoit quelque chose, on lit le caractère et on le traite
        // Note : sinon, on ne fait rien (donc on reste dans la boucle infinie)
        if ( Serial.available() > 0 ) {
             
            // Lecture
            serialLetter = Serial.read();
 
            // Si c'est la touche ENTER, on quitte la boucle infinie
            if ( serialLetter == '\r' || serialLetter == '\n' ) {
                break;
            }
 
            // Si la boucle n'a pas été quitté, c'est que ce n'est pas la touche ENTER
            // Donc on ajoute le caractère à la string
            serialCommand += serialLetter;
             
        }
 
    }
 
    // Dès que l'on arrive ici, c'est que la touche ENTER a été utilisée
    // Donc on va traiter la chaine reçue
 
    if ( serialCommand == "MDP" ) {
        digitalWrite(13, HIGH);
    }
 
    if( serialCommand == "Reset" ) {
        digitalWrite(13, LOW);
    }
 
    // Fin du traitement,
    // Fin de la fonction loop
    // => c'est reparti pour un tour
 
}

ça sa fonctionne nikel mais si je duplique le code d'une manière a y ajouter le second port cela deviens lent et aléatoire !!! a part la boucle je ne voie pas ce qui bloque le µP.
Sans doute que je ne comprend pas ce que vous me dite part Bloquant !!!

Aussi je ne vous demande pas d’écrire le code mais la je bug vraiment !!!!

j'ai essayer divers code divers système de lecture voir envisager de changer de board.
Je pense même mettre mes 2 devices en parallèle sur un seul port via des diodes mais je perdrais entre 0.6 et 0.2 V selon la diode utilisée. De plus je ne croie pas que se soit la bonne solution car risque de conflit dans l'envois des signaux ou colision des paquets.

Franchement je ne sais plus dans quelle type de fonction pour le code je doit me diriger !!!

Merci a vous d'avoir autant de patience

Tu places tes fonctions de lecture dans des boucles infinies donc tu crées de nouveau des lectures bloquantes.

loop() est déjà une boucle infinie, il suffit de tester pour chaque interface si un caractère est disponible et si oui le placer dans un buffer. Lorsque tu reçois un terminateur pour l'une des interfaces tu appelles la fonction de traitement associée.
Ainsi tu es réactif sur toutes tes interfaces. Pour autant que ta fonction de traitement ne soit pas trop longue.

Oui a propos de la boucle infinie for (;:wink: je comprend bien !! mais dans cette boucle je n'ai pas de fonction bloquante ??? et si j'y écrit la même chose pour le second port avec les même commande non bloquante je devrais sortir de ma boucle for (;:wink: avec comme résultat le basculement de l’état de la LED et enfin attaquer la suite du code et revenir au début de ma Loop.
Donc en resumer si deja dans ma boucle for ( ;; ) ce n'est pas stable c'est qu'il y a un bleme !!! non ??

Ci bas c'est le même code avec la gestion des 2 ports sans fonction bloquant a part la boucle for !!!

sa devrais quant même fonctionner non ???? et sans conflit n'y de retard quant même !!!

Ou alors je suis un peu c.. !!! seul moi me permet de le dire lollll

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX

void setup() {
    Serial.begin(9600);
    mySerial.begin(9600);
    pinMode(13,OUTPUT);
    digitalWrite(13,LOW);
}
 
String serialCommand1;
char serialLetter1;
String serialCommand2;
char serialLetter2;
 
 
void loop()
{
     
    serialCommand1 = "";
    serialCommand2 = ""; 
    // Boucle infinie (que l'on quitte lorsque l'on appuis sur la touche ENTER)
    for (;;) {
         
        // Si la com reçoit quelque chose, on lit le caractère et on le traite
        // Note : sinon, on ne fait rien (donc on reste dans la boucle infinie)
        if ( Serial.available() > 0 ) {
             
            // Lecture
            serialLetter1 = Serial.read();
 
            // Si c'est la touche ENTER, on quitte la boucle infinie
            if ( serialLetter1 == '\r' || serialLetter1 == '\n' ) {
                break;
            }
 
            // Si la boucle n'a pas été quitté, c'est que ce n'est pas la touche ENTER
            // Donc on ajoute le caractère à la string
            serialCommand1 += serialLetter1;
             
        }

         if ( mySerial.available() > 0 ) {
             
            // Lecture
            serialLetter2 = mySerial.read();
 
            // Si c'est la touche ENTER, on quitte la boucle infinie
            if ( serialLetter2 == '\r' || serialLetter2 == '\n' ) {
                break;
            }
 
            // Si la boucle n'a pas été quitté, c'est que ce n'est pas la touche ENTER
            // Donc on ajoute le caractère à la string
            serialCommand2 += serialLetter2;
             
        }


        
 
    }
 
    // Dès que l'on arrive ici, c'est que la touche ENTER a été utilisée
    // Donc on va traiter la chaine reçue
 
    if ( serialCommand1 == "MDP" || serialCommand2 == "MDP" ) {
        digitalWrite(13, HIGH);
    }
 
    if( serialCommand1 == "Reset" || serialCommand2 == "Reset" ) {
        digitalWrite(13, LOW);
    }
 
    // Fin du traitement,
    // Fin de la fonction loop
    // => c'est reparti pour un tour
 
}

bonjour,
code entre balise code </>

pourquoi s'emmerd... avec une boucle for?

if ( Serial.available() > 0 ) {
             
            // Lecture
            serialLetter1 = Serial.read();
 
            // Si c'est la touche ENTER, on quitte la boucle infinie
            while ( serialLetter1 != '\r' || serialLetter1 != '\n' ) {
           
            // Si la boucle n'a pas été quitté, c'est que ce n'est pas la touche ENTER
            // Donc on ajoute le caractère à la string
            serialCommand1 += serialLetter1;
             
        }
}

if ( mySerial.available() > 0 ) {
             
            // Lecture
            serialLetter2 = mySerial.read();
 
            // Si c'est la touche ENTER, on quitte la boucle infinie
           while ( serialLetter2 != '\r' || serialLetter2 != '\n' ) {
            serialCommand2 += serialLetter2;
            }
            
        }

Oki je voie sa ce soir et je vous tien au courant du résultat !!!!

Merci de l'aide !!!

erreur de ma part

while ( Serial.available() > 0 ) {
             
            // Lecture
            serialLetter1 = Serial.read();
 
            // Si c'est la touche ENTER, on quitte la boucle infinie
            if ( serialLetter1 != '\r' || serialLetter1 != '\n' ) {
           
            // Si la boucle n'a pas été quitté, c'est que ce n'est pas la touche ENTER
            // Donc on ajoute le caractère à la string
            serialCommand1 += serialLetter1;
             
        }
}

while ( mySerial.available() > 0 ) {
             
            // Lecture
            serialLetter2 = mySerial.read();
 
            // Si c'est la touche ENTER, on quitte la boucle infinie
           if ( serialLetter2 != '\r' || serialLetter2 != '\n' ) {
            serialCommand2 += serialLetter2;
            }
           
        }

Le_Joebar:
Ci bas c'est le même code avec la gestion des 2 ports sans fonction bloquant a part la boucle for !!!

sa devrais quant même fonctionner non ???? et sans conflit n'y de retard quant même !!!

Dans ce cas qu'elle problème rencontres-tu?
En ce qui concerne le risque de conflit il est toujours là (d'un point de vue logiciel) si les 2 liaisons série reçoivent en même temps des commandes contradictoires.

A noter, lorsqu'une commande est reçue sur l'une des liaisons cela remet à zéro les 2 buffers du coup tu peux te retrouver avec une chaîne tronquée dans le second buffer quand il reçoit la suite de la commande.

A noter aussi, tu mets le terminateur (\n ou \r) dans le buffer donc l'egalité que tu cherches pour identifier la commande reçue n'est pas rencontrée. Il faudrait rejeter ces caractères.

Quelqu'un peut il essayer physiquement car chez moi sa ne vas pas.
ce n'est surement pas hardware car je suis tech et sur de mon câblage comme je suis pas diplômer en prog sa ne peut venir que de la !!!! ou l'inverse car la je suis vraiment out !!!!

Donc si quelqu'un peut essayer de mettre sur un nano au serial 1 la console pc et sur le port 2,3 software serial une autre connexion rs232 genre Nextion "écran" les 2 baud à 9600 et réussir a allumer via une commande "1" et a éteindre commande "2" , de la console ou de l'écrant et inversement, Je lui serais super reconnaissant car avec tous les conseilles les teste etc... je pense vraiment que se n'est pas possible !!! et surtout je permet au Moderateur de m'ejecter du forum !!!! si quelqu'un y arrive !!!!! car vraiment je suis blaser presque 3 semaine d'essaie et quelque soit le prg c'est presque toujours le même résultat !!!!

Pour info voici le dernier code et résultat ......
a vous de voir !!!

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX

void setup() {
    Serial.begin(9600);
    mySerial.begin(9600);
    pinMode(13,OUTPUT);
    digitalWrite(13,LOW);
}
 
String serialCommand1;
char serialLetter1;
String serialCommand2;
char serialLetter2;
 

void loop ()
{
if ( Serial.available() > 0 ) {
             
         
         serialLetter1 = Serial.read();
 
          
            if (serialLetter1 != '\n' ) {
           

            serialCommand1 += serialLetter1;
             
        }
}

while ( mySerial.available() > 0 ) {
             
 
           serialLetter2 = mySerial.read();
 
           
            if ( serialLetter2 != '\n' ) {
              
              serialCommand2 += serialLetter2;
          }
           
       }


 if ( serialCommand1 == "1" || serialCommand2 == "1" ) {
        digitalWrite(13, HIGH);
        serialCommand1 ="";
        serialCommand2 ="";
    }
 
    if( serialCommand1 == "2" || serialCommand2 == "2" ) {
        digitalWrite(13, LOW);
        serialCommand1 ="";
        serialCommand2 ="";
      }

    

        

}

pas testé avec deux cartes, mais essaye ca

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX

int ledPin = 13;
String readString;

void setup() {
  Serial.begin(9600);
   mySerial.begin(9600);
  pinMode(ledPin, OUTPUT); 
  Serial.println("serial on/off"); // so I can keep track
}

void loop() {

  while (Serial.available()) {
    delay(3);  
    char c = Serial.read();
    readString += c; 
  }


 while (mySerial.available()) {
    delay(3);  
    char c = Serial.read();
    readString += c; 
  }


  
  readString.trim();
  if (readString.length() >0) {
    if (readString == "MDP"){
      Serial.println("MDP on");
      digitalWrite(ledPin, HIGH);
    }
    if (readString == "Reset")
    {
      Serial.println("Reset off");
      digitalWrite(ledPin, LOW);
    }

    readString="";
  } 
}

Merci a tous,

Enfin sa fonctionne j'avais omis de faire savoir que sur le port serial c'etais un NEXTION qui en plus d'envoyer 1 il m'envoyais l'info du changement de page, et que sur le softserial c'est un ESP01 qui me fait un string IPD+ ....

Donc mon analyse sur 1 et 2 etais tout a fait faut.

Voici le code qui fonctionne.

Merci a vous tous.

Merci a chacun qui ma apporter de l'aide et qui m'a fait reflechire.

Voici le code :

#include <SoftwareSerial.h>
SoftwareSerial mySerial(3, 2); // RX, TX

void setup() {
    Serial.begin(9600);
    mySerial.begin(9600);
    pinMode(13,OUTPUT);
    digitalWrite(13,LOW);
}
 
String serialCommand1;
char serialLetter1;
String serialCommand2;
char serialLetter2;


void loop ()
{
if ( Serial.available() > 0 ) {
             
         
         serialLetter1 = Serial.read();
 
          
            if (serialLetter1 != '\n' ) {
           

            serialCommand1 += serialLetter1;
             
        }
}

if ( mySerial.available() > 0 ) {
             
 
           serialLetter2 = mySerial.read();
 
           
            if ( serialLetter2 != '\n' ) {
              
              serialCommand2 += serialLetter2;
          }
        
       }


 if ( serialCommand1 == "1" || serialCommand2.endsWith( "+IPD,0,2:1") ) {
        digitalWrite(13, HIGH);
        serialCommand1 ="";
        serialCommand2 ="";
    }
 
    if( serialCommand1 == "2" || serialCommand2.endsWith("+IPD,0,2:2") ) {
        digitalWrite(13, LOW);
        serialCommand1 ="";
        serialCommand2 ="";
      }