Bonsoir à tous,
je bute ce soir sur un comportement étrange dans une liaison entre 2 ESP32 par Serial en utilisant des structures.
j'ai besoin d'échanger en bidirectionnel.
J'ai d'abord écrit 2 codes tests dont le séquencement est bêtement traité par des delay.
Là n'est pas le problème., il se situe sur l'interprétation fausse d'un côté :
Premier ESP que j'appellerai "Ventil" :
Chaudiere envoie un mix de format vers Ventil. Tout se passe bien, même si pour faire court je n'ai affiché que la première variable.
Ventil envoie 3 booléens vers Chaudière. Pour vérifier la transmission j'ai monté les 2 premiers en true et le troisième en false.
Voici ce que Chaudière reçoit (extrait du moniteur série :
pouvez vous rajouter un delay de 5000 juste après la config des ports séries et avant de commencer à balancer des bits histoire de vous laisser le temps de rebooter les 2 ESP32 ? avez vous le même comportement ?
A titre de curiosité, que se passe-t-il si vous mettez 115200 bauds au lieu de 1200 (qui est super lent) pour la communication croisée ? avez vous le même comportement ?
➜ faire une communication binaire sur une liaison asynchrone avec gestion des timeout (lecture bloquante) et des délais est dangereux car vous ne maitrisez pas ce qu'il se passe.
Pour bien écouter ub nport série (ou gérer un flux asynchrone de manière générale) vous pouvez jeter un oeil à mon petit tuto sur le sujet. On lit au plus vite sans bloquer la loop and quand on a reçu toute une trame on effectue le traitement. Si vous pouvez aussi envoyer un marqueur de début ou fin de trame cela aide à la synchro entre les 2 appareils.
pouvez vous rajouter un delay de 5000 juste après la config des ports séries
c'est pire : l'ESP Ventil affiche la valeur d'une autre variable.
A titre de curiosité, que se passe-t-il si vous mettez 115200 bauds au lieu de 1200 (qui est super lent) pour la communication croisée ? avez vous le même comportement ?
pas de changement par rapport à la situation intiale (OK côté ESP Ventil). L'installation tourne depuis plus de 5 ans avec une distance de 5m. Par précaution j'ai utilisé 2 adaptateurs TTL- RS232 et choisi une vitesse faible.
La raison de mes modifications est rendre plus propre les échanges, tous basés sur des String. C'est pour cela que je suis en train de tester la solution "struct".
En unidirectionnel ça fonctionne parfaitement.
Pour bien écouter un port série (ou gérer un flux asynchrone de manière générale) vous pouvez jeter un oeil à mon petit tuto sur le sujet.
Je remarque que votre tuto est basé sur la classe String, ce que je veux à présent éviter car l'installation est en fait un Mega en chaudière et un ESP en Ventil, et elle souffre de fragmentation de RAM avec des plantages tous 15 - 20 jours...
La solution structure m'avait paru idéale dans ce sens.
ça démontre que votre code n'est pas robuste et qu'il est dépendant du timing (traitement synchrone d'une communication asynchrone)
absolument pas... Je n'utilise pas cette classe (et sur MEGA, si vous utilisez correctement la classe String vous ne devriez pas avoir de fragmentation).
Le principal souci dans une communication binaire est de synchroniser les débuts de message - éventuellement ajouter un CRC dans la structure pour valider que le buffer est bien reçu où mettez en début de structure un code sur quelques octets 0xDEADBEEF par exemple qui est peu probable d'être contenu dans le message binaire et servez vous en pour synchroniser les échanges
En plus de ce qu'a indiqué @J-M-L, tu peux en début de ta structure avoir la taille de celle-ci.
Comme tu utilises des plateformes différentes, il faudrait aussi forcer l'alignement des propriétés de la structure sur un octet.
ca fait plaisir de se sentir moins seul, même si on se sent encore plus ignorant
Je vais donc éclaircir :
L'installation (chauffage) actuelle tourne avec un Arduino Mega 2560 (code "chaudière") connecté à 5m à un ESP32 via 2 adaptateurs TTL - RS232 (code "ventil").
Je n'ai pas de souci de données erronées ou manquantes avec de simples Serial.print / readStringUntil. Peut-être quelques irrégularités dans la cadence, mais en chauffage les événements peuvent être traités avec qq secondes de retard... Par contre l'ESP32 actuel crashe tous les 15 - 20 jours (malgré dans taille de RAM "confortable"...
Je prépare actuellement le remplacement du coffret "ventil", toujours en ESP32 et TTL RS232 et profite pour coder plus proprement.
La future platine du coffret est prête et c'est sur elle que je code "ventil". A ses côtés j'ai une breadboard portant un autre ESP que j'appellelrais "fausse chaudière". En breadboard c'est plus pratique qu'un Mega et les niveaux sont identiques. Je n'utilise donc pas les TTL_RS232 dans ce test. La liaison série fait 50cm...
est-ce un adapteur RS232 vers TTL avec niveau logique 3,3V et 5V supportés?
Oui puisqu'ils fonctionnent depuis 5 ans ainsi et n'entrent pas dans la réflexion car n'étant pas utilisés dans mes tests.
avez vous regardé où ça crash?
Non, je ne sais pas (encore) faire. Je peux juste dire qu'un simple soft reset par ESP.restart() tous les soirs (équivalent à un appui bouton ) ne changent rien à la durée entre crashes.
J'ai compris que la RAM de l'ESP32 ne se vide pas sans coupure d'alimentation.