Println dans le Setup KO

Bonjour,

Je rencontre toujours un éternel problème que je n'arrive pas à élucider et c'est vraiment pénible :frowning:
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 :frowning:

Si qqun a une explication, je lui en serait tellement reconnaissant :wink:
merci par avance pour votre aide.

Bonjour

un delay(1000) avant le println() du setup() pourrait arranger les choses en laissant le temps pour l'initialisation de l'UART au démarrage.

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 :confused:
alors qu'il fonctionne bien dans le loop (via la télécommande même)

Le problème a été évoqué ailleurs sur le forum, et une solution proposée : peux-tu la tester ?
On cherchera à comprendre ensuite...

void loop (void)
{
   delay (1000);
   Serial.println ("loop");
}

void setup (void)
{
    Serial.begin (9600);

#if 1
    delay (1000);
#else
    while (! Serial)
        ;
#endif
    Serial.println("Just checking if it properly works");
}

Autre lien qui en parle (du même auteur)

j'obtiens ce résultat :

Just checking if it properly works
loop
loop
loop

ca semble pas mal ... mais je comprends pas du coup :open_mouth:

Moi non plus :slight_smile:
Peux-tu poster les options de l'IDE et une image de ta carte ?

Si c'est une carte avec deux connecteurs USB-C, il est possible que tu n'utilises pas le bon (source)

Voici les documents fourni par le vendeur :

ESP-32 NodeMCU Developmentboard Schematic.pdf (846.4 KB)
ESP-32 DevKit C Development Board Datenblatt.pdf (947.9 KB)
ESP-32 NodeMCU.pdf (1017.3 KB)

OK, donc un seul connecteur...

Bon, essayons de savoir ce qui règle le problème dans ce code.
Peux-tu tester :

void loop (void)
{
   delay (1000);
   Serial.println ("loop");
}

void setup (void)
{
    Serial.begin (9600);
    delay (1000);
    Serial.println("Just checking if it properly works");
}

puis :

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...

1 Like

Le premier fonctionne :

Just checking if it properly works
loop
loop

Le second n'affiche que les "Loop" :

loop
loop
loop

ok, donc tu as déjà une version qui fonctionne.
Que se passe-t-il si dans cette version tu intervertis setup et loop ?

Si ça ne fonctionne pas, alors teste ton code en mettant le setup après la loop avec le while dans le setup.

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.

Mes 5 cts avec pas mal de suppositions.

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()

Bonjour

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.

Ça a été testé aux posts 2 et 3 mais ça ne semble pas suffire

Ne sert strictement à rien sur un USB non natif, la valeur de retour est forcément 1
EDIT j'ai fait court

Il faut citer tout ce qu'il y a à citer :grinning:

J'ai écrit :

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();
}

Il n'y a pas a patauger il y a un delay pour l'établissement et cela fonctionne

Il n'y a pas de delay et cela ne fonctionne pas. Pas de délai parce que while (! Serial); ne représente aucun délai si ce n'est pas de l'USB natif

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.

Mais je ne sais pas pourquoi...