Gestion de deux Port Serial sur Nano

Bonjour a tous,

Voici la question ou mon entonnement !!????

Sur mon Arduino Nano je cherche a y connecter sur un serial software borne (4,5) un ESP 8266 01 et sur le serial hardware (1,2) y connecter un nextion.

Le but de mon essaie est d'allumer la pin 13 via une commande du Nexion ou de l'ESP.

Le Nextion sort via son port RS232 une String On ou OFF, L'ESP une String style Ledon ou led off.

J'emploie pour lire les strings un code du style:

ESP.readbyteuntil..... et Serial.readbyteuntil..... bizarrement quant je fait fonctionner qu'une partie du programme lecture de l'ESP et que je met // sur la partie Serial tous vas bien et idem // ESP et lecture via le Serial tous ce passe bien aussi mais quant les deux doivent fonctionner ensemble d'une part c'est d'une lenteur et d'autre par c'est assez aléatoire !!!
Donc Je garde ESP.readbytuntil et Serial.find idem ou ESP.find et Serial.find idem !!!

Devrais je prendre un MEGA pour c'est 3 port Serial ou serais ce un problème de soft ????

Merci de vos conseil !!!

Le_Joebar:
ou serais ce un problème de soft ????

Ce serai pas mal de nous joindre le code pour être en mesure de repondre

Voici le code et quelques problèmes que je remarque :

  • la lenteur si je supprime la lecture du port Serial pas de problème si je ne lit que le Serial aussi.
    -Quant les deux fonctionnes c'est super lent et de plus je ne sais pourquoi quant le Serial reçois 1 la diode s'allume et s' éteint !!!

Vraiment étrange devrais je passe au Mega pour gérer 2 Serial en ardware ????

sketch_sep23a.ino (1.81 KB)

Bonjour,

Pour moi le problème ce trouve dans le fonctionnement des fonctions utilisés qui sont de type bloquante.

Dans la documentation de la fonction Serial.ReadBytesUntil(), le premier paragraphe (Serial.readBytesUntil() - Arduino Reference):

Serial.readBytesUntil() reads characters from the serial buffer into an array. The function terminates if the terminator character is detected, the determined length has been read, or it times out (see Serial.setTimeout()).

Ce paragraphe indique que la fonction renvoie un résultat uniquement dans deux cas : le premier est que tu reçois le caractère de fin de ligne, le deuxième cas, si tu a configurer un timeout alors la fonction renverra 0 si celle-ci ne lit pas de caractère suivi du caractère de fin de ligne pendant la période de lecture.

Il serait judicieux de vérifier la présence de caractère dans le buffer interne avant de remplir ton tableau, par exemple via la fonction Serial.available().

A titre d'information, si ton "NomDuReseauWifi" et ton mot de passe ne changent pas, il serais préférable de ne pas utiliser des variables pour stocker ces informations mais plutôt utiliser des #define :

#define NomDuReseauWifi XXXXXXXXX
#define MotDePasse XXXXXXXX

Ceci afin de réduire l'espace mémoire utilisé à la fois pour le stockage du programme mais également la RAM.

Timiti29

Merci Timiti29 pour l'info a propos du passe et du réseau je change cela !!

Par contre si je comprend bien tu ferais ceci ? :

if (Serial.available()>0) {Serial.readBytesUntil('\n',buffer, BUFFER_SIZE);}
if (esp.available()>0) {esp.readBytesUntil('\n',buffer, BUFFER_SIZE);}

c'est sa ?

J'ai essaie ceci mais rien n'y change !!!

if (Serial.available()>0) {Serial.readBytesUntil('\n',buffer, BUFFER_SIZE);}
if (esp.available()>0) {esp.readBytesUntil('\n',buffer, BUFFER_SIZE);}

Est ce qu'un Mega est plus adapté a la lecture de deux serial !!!

C'est vraiment dommage de devoir changer de board pour 2 UART Mais si je n'ai pas le choix !!!

Si quelqu'un a une idée !!!!!

La solution ne pas utiliser readBytesUntil() qui est bloquante.
Lire les caractères reçus un par un avec un read().
Les mettre dans un buffer.
Si on a reçu le caractère de fin lancer l'interprétation.