Je rencontre toujours un éternel problème que je n'arrive pas à élucider et c'est vraiment pénible
J'utilise un ESP32 AZ-Delivery (CP2102). Et je suis avec l'IDE 2.3.3.
Et j'ai beau tester plein de trucs, impossible de faire afficher quoique ce soit via le Setup !? Comme s'il ne passait pas dans le Setup.
Pourtant il passe bien dans le Loop.
Pour exemple, j'utilise ce code qui ne peut pas être plus simple :
void setup() {
// Initialisation de la communication série à 9600 bauds
Serial.begin(9600);
// Affichage d'un message dans le moniteur série
Serial.println("Bonjour, le setup est en cours d'exécution !");
}
void loop() {
// La boucle principale reste vide pour cet exemple
Serial.println("Dans le Loop !");
delay(1000);
}
Et j'obtiens comme résultat uniquement :
Dans le Loop !
Dans le Loop !
...
J'ai cru a un problème matériel et j'ai racheté des ESP32, mais même résultat
Si qqun a une explication, je lui en serait tellement reconnaissant
merci par avance pour votre aide.
Bonjour,
Merci pour le retour.
Non, cela ne change rien, j'ai également tester plusieurs delay.
J'ai egalement testé de mettre ca
while (!Serial) {
;
}
mais toujrous rien
Ce qui est étrange c'est qu'il rentre bien dans mon Setup et exécute certaines fonctions car dans un script plus complet, j'initialise les paramètres pour une télécommande également avec un ESP32, et celle ci fonctionne bien.
et comme pour le println, j'ai également un script qui me permet de bouger des servomoteurs, mais l'appel de celui ci dans le Setup n'y fait rien
alors qu'il fonctionne bien dans le loop (via la télécommande même)
void loop (void)
{
delay (1000);
Serial.println ("loop");
}
void setup (void)
{
Serial.begin (9600);
while (! Serial);
Serial.println("Just checking if it properly works");
}
Si seul l'un des deux marche, on aura un début d'idée. Si les deux marchent, alors c'est dû à l'interversion de la loop et du setup (en général, on met le setup avant la loop). Mais je ne vois pas pourquoi le compilateur ferait un code différent si le setup est avant la loop...
Sujet très perturbant.
Dans la recherche d’explication, (je vous laisse faire), il faudrait aussi s’intéresser au fichier main.cpp, qui est le véritable fichier qui est transmis au compilateur et dont le squelette est dans les différents ”cores” ou ”frameworks” de l’IDE.
Un certain nombre de ”choses” y sont faites.
Ce que je peux dire, c’est que le défaut semble à priori independant de l’IDE : Arduino ou platformIO.
J’ai aussi l’impression que cela ne se passe qu’avec des micros qui sont ”natifs USB” .
Que l’on utilise l’USB native ou la voie classique UART- CH340 (ou équivalents) ne semble pas influer.
Si la liaison série utilise l'USB natif alors il faut le temps que le CPU boot + énumération sur le bus USB + chargement du driver dans le PC hôte cela prend du temps et il faut mettre un delay() relativement important dans setup() avant de commencer à faire des Serial.print()
J’ai aussi l’impression que cela ne se passe qu’avec des micros qui sont ”natifs USB” .
La carte utilisée par @fasstoch comporte un ESP32 'première génération' = sans USB natif. (si l'on en croit le marquage du module , marquage spécifique au vendeur AZDelivery)
-Les diverses carte testées viennent-elles toutes d'AZDelivery ?
-Quelle carte a été sélectionnée dans l'IDE ?
-Le comportement est-il inchangé si l'UART est configuré 115200 bauds , auquel cas le débit reste celui utilisé pour le message de boot.
Mon hypothèse (très hypothétique) est que c'est plutôt dans l'établissement de l'UART que cela se passe. Donc qu'il y ait USB natif, ou pas, n'influerait pas.
Ce que parait confirmer @al1fch qui fait remarquer que le modèle d'ESP32 utilisé n'a pas d'USB natif.
L'ESP32 est un micro à terminer par le client (ici le client est Espressif).
Le client a le choix pour terminer le micro d'acheter des blocs "d'électronique" à Cadence ou de faire le travail avec de la programmation interne, c'est ce dernier choix qu'Espressif préfère pour des questions financières.
Au sujet de l'inversion setup et loop assez incompréhensive @fasstoch tu pourrais tenter ceci :
Cela parait farfelu, mais comme on patauge pourquoi pas.
Le but est de mettre en évidence si la fonction loop() doit obligatoirement, ou pas, être en tête de fichier code.
void configure()
{
Serial.begin (9600); // 115200 serait préférable à 9600
#if 1
delay (1000);
#else
while (! Serial) ;
#endif
Serial.println("Just checking if it properly works");
}
void loop()
{
}
void setup()
{
configure();
}
D'après le message 3, le delay tout seul ne fonctionne pas, sauf erreur de l'OP.
Pour l'instant, c'est l'interversion setup / loop ET le delay qui permettent de fonctionner.