Serial.print en mode "debug"?

Bonjour,

Lors du développement et dépannage de mes sketches, j'utilise beaucoup serial.print pour visualiser dans la console les valeurs de mes variables ou le passage dans les fonctions.

Je me demandait s'il y avait une valeur ajoutée à créer une variable 'debug' qui serait active (true) pour le dépannage et désactivée (false) en production ? En gros le fait d'avoir des serial print alors qu'il n'y a pas de console a t-il une incidence sur les performances, l'utilisation mémoire ou autre ?

En pratique, que conseillez vous ?

Par exemple pour blink.ino

bool debug = true;  // Affiche sur la console si true, passer à false en production.

void setup() {
   Serial.begin(115200);
   if ( debug ) {
      Serial.println ("Chargement du setup");
      }
   pinMode(LED_BUILTIN, OUTPUT);
   }

void loop() {
  digitalWrite(LED_BUILTIN, HIGH); 
  if ( debug ) {
    Serial.println("LED allumée");
  }
  delay(1000);                       
  digitalWrite(LED_BUILTIN, LOW);  
  if ( debug ) {
    Serial.println("LED éteinte");
  }
  delay(1000);
}                       

Merci

Vous avez raison de créer une variable "debug". Serial.print() prend du temps de traitement et n'a besoin d'être vu que lors de la correction des problèmes. Il sera "compile-out" lorsqu'il est défini sur "false"

On trouve sur le forum d'intéressantes discussions sur des astuces pour afficher des variables uniquement en mode débug. Par exemple :

Tu places ceci au tout début de ton code :

#define DEBUG   //If you comment this line, the DPRINT & DPRINTLN lines are defined as blank.
#ifdef DEBUG    //Macros are usually in all capital letters.
   #define DPRINT(...)    Serial.print(__VA_ARGS__)     //DPRINT is a macro, debug print
   #define DPRINTLN(...)  Serial.println(__VA_ARGS__)   //DPRINTLN is a macro, debug print with new line
#else
   #define DPRINT(...)     //now defines a blank line
   #define DPRINTLN(...)   //now defines a blank line
#endif

Ca définit de nouvelles commandes pour toi (DPRINT et DPRINTLN) qui seront équivalentes lors de la compilation à Serial.print et Serial.println uniquement si la ligne #define DEBUG n'est pas commentée.
Lors de ta phase de débug, tu laisses cette ligne décommentée et tu utilises DPRINT et DPRINTLN pour afficher ce que tu veux dans la console. Lorsque tu as fini ta phase de débug, tu n'as plus qu'à commenter cette première ligne, et le compilateur ne prendra plus en compte les lignes contenant DPRINT et DPRINTLN, te laissant avec in code qui n'affiche plus tes valeurs.
Et si tu veux recommencer le débug, il te suffit de décommenter la première ligne et de continuer...

D'autres astuces intéressantes dans la suite de la discussion indiquée plus haut... (à lire)

Bonjour, excuse moi:
my French is lost (long time ago...).

This

#define DEBUG
...

is really great, sophisticated and will do the job.

You can also code as:

#ifdef DEBUG
   Serial.println("a debug message...");
#endif

When you define DEBUG - it will do the stuff, if you do not define - it is quite (omitted).

1 Like

Bonjour,

Merci pour vos réponses. :+1:

Voici les résultats à la compilation du sketch blink.ino modifié (pour une carte Arduino UNO)

  • sketch avec les if (debug) et debug = false ; 1980 oct espace de stockage ; 188 oct. variables dynamiques.
  • sketch avec les if (debug) et debug = true ; 2050 oct espace de stockage ; 234 oct. variables dynamiques.
  • sketch l'entête DEBUG et //define DEBUG (commenté) ; 1918 oct espace de stockage ; 184 oct. variables dynamiques.
  • sketch l'entête DEBUG et define DEBUG (décommenté) ; 2050 oct espace de stockage ; 234 oct. variables dynamiques.

Ce sketch de base n'est paut être pas hyper représentatif. :thinking:

Mais au delà de la beauté du geste et les octets gagnés, d'expérience, pensez vous que ça serve à quelque chose d'autre ?

A+

Déplace le Serial.begin dans le #idef DEBUG et tu vas gagner 1K de Flash et presque toute la RAM

1 Like

L'idée n'est pas de faire joli ni optimal mais de faciliter le débug. Tu passes de débug à 'pas débug' simplement en commentant une ligne. Ensuite, si tu as un autre problème à trouver, il te suffit de décommenter la ligne et tu continues le débug.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.