masquer les commentaires du port serie

Bonjour,
J'aurai aimé savoir si quelqu'un connaissais une méthode qui consiste à masquer tous les commentaires "serial.print" et qui puisse être activé par une commande sur le moniteur.

Il me semble avoir déja vu ça, mais je ne parviens pas à y remettre la main dessus.

Merci pour votre aide!

Fermez le moniteur série et vous ne les verrez plus :slight_smile:

Non pas de recette magique, votre code doit gérer cela

Une idée comme cela qui faute de mieux n'utilise pas une commande mooniteur mais une pin :
Un interrupteur sur un pin qui l'a met soit à 1 soit à 0
Choix : messages affichés si pin à Vcc.

remplacer
Serial.print("xxxxxx")
par
if (pin) {Serial.print("xxxxxxxxx").; }

pour compléter la solution (que j'utilise) de 68tjs, tu peux te servir d'une variable modifiable par le moniteur il suffit pour cela d'écouter en permanence le moniteur et d'établir un "protocole" pour mettre cette variable a 1
ensuite tu fais if (pin||variable) {Serial.print("xxxxxxxxx").; }

rjnc38:
pour compléter la solution (que j'utilise) de 68tjs, tu peux te servir d'une variable modifiable par le moniteur il suffit pour cela d'écouter en permanence le moniteur et d'établir un "protocole" pour mettre cette variable a 1
ensuite tu fais if (pin||variable) {Serial.print("xxxxxxxxx").; }

Ou plus précisément if (digitalRead(pin) == HIGH) {...

Et ça peut se mettre dans une fonction genre debugPrint() et debugPrintln() par exemple pour simplifier le code (ou dans un #define)

Les solutions proposées sont tout à fait fonctionnelles, mais il faut savoir que, ce faisant, toute la bardée de "print" que vous masquez/utilisez se trouve dans le code : c'est à dire dans la mémoire flash et dans la RAM

C'est très différent d'un :

#define afficher // commenter ou non selon que l'on veut masquer les "print" ou non
#ifdef afficher
  Serial.print( ...);
  ...
#endif

qui va inclure ou non le code dans le programme.

Cela peut être important .. ou pas.

Cordialement.

Pierre

C'est peut être déconcertant pour débuter mais on peut être curieux et se documenter sur le C : dans la condition du if (ou d'un while) le résultat du test est un booléen --> VRAI ou FAUX..
La valeur 0 est considérée comme un booléen "FAUX" et toutes autres valeurs entières sont considérées comme un booléen "VRAI"

Donc si le if doit être vrai quand variable = 1
écrire
if (variable==1)
ou
if (variable)

revient à la même chose et ne me semble pas être intellectuellement plus difficile à comprendre.

68tjs:
if (variable==1)
ou
if (variable)

revient à la même chose et ne me semble pas être intellectuellement plus difficile à comprendre.

mouais méfiance quand même :slight_smile:
Par exemple, si un jour suite à une évol malencontreuse, la variable prend la valeur 2, les deux versions du if ne donneront pas la même chose.

Comme le if(toto) revient à tester si toto est différent de zéro, la bonne équivalence serait plutôt if(toto == 0) et if (!toto)

Et puis après tu peux aussi appliquer ce même principe à HIGH et LOW, et finir par coder des if (!digitalRead(pin))

Perso je trouve plus sain de rester sur des évaluations utilisant des constantes prédéfinies.
Les seuls cas où je mets un if (toto) sont ceux où toto est déclaré de type bool, et affecté explicitement à true ou false ou au résultat d'un opérateur logique.
Mais il est vrai que la différence est assez négligeable sur le code généré.

Bonjour,

En fait if (variable) est plutôt équivalant à if (variable!=0)

Par exemple, si un jour suite à une évol malencontreuse, la variable prend la valeur 2, les deux versions du if ne donneront pas la même chose.

J'ai écrit :

La valeur 0 est considérée comme un booléen "FAUX" et toutes autres valeurs entières sont considérées comme un booléen "VRAI"

Toutes les valeurs entières, autres que 0, même les négatives sont considérées comme "VRAI".
Aucune confusion n'est possible.

kamill:
En fait if (variable) est plutôt équivalant à if (variable!=0)

Oui on aussi dire comme cela mais sans le "plutôt" en ce qui me concerne.
J'ai trouvé cette information dans des manuels de C.

Bonsoir tous le monde,
L'idée de 68tjs est sympa, mais cela implique d'utiliser une pin qui pourrai être utile . Les réponse de ChPr et pepe correspondent à ce que je cherche. De toute manière, le moniteur est utilisé pour visualiser les debug donc, pourquoi ne pas l'utiliser pour voir ou masquer les commentaires.

Merci à tous, je vais évoluer dans cette direction.

//--------------------------------------------------------------------------
//Serial
#include <SoftwareSerial.h>
//--------------------------------------------------------------------------

bool debug = false;

//--------------------------------------------------------------------------
void setup()
{
  Serial.begin(9600);
  Serial.println(F("Pret"));
}

//--------------------------------------------------------------------------
void loop()
{
  for (int i = 0; i < 50; i++)
  {
    debugPrintln(F("abc"));
  }
  for (int i = 0; i < 50; i++)
  {
    debugPrint(F("abc "));
  }
  for (int i = 0; i < 50; i++)
  {
  }
  Debug();
}

//--------------------------------------------------------------------------
bool Debug()
{
  while (Serial.available())
  {
    char c = Serial.read();
    if (c == 'M' || c == 'm')
    {
      Serial.println(F("M"));
      debug = false;
    }
    if (c == 'V' || c == 'v')
    {
      Serial.println(F("V"));
      debug = true;
    }
  }
}

//--------------------------------------------------------------------------
void debugPrint(String Print)
{
  if (debug) Serial.print(Print);
}

//--------------------------------------------------------------------------
void debugPrintln(String Print)
{
  if (debug) Serial.println(Print);
}

//--------------------------------------------------------------------------

Votre fonction Debug() promet de retourner un booléen mais ne retourne rien...déclarez là en void Debug(). Vous pouvez aussi ajouter un else entre les 2 if.

Si vous n’utilisez le port série pour aucune entrée de donnée à part cela, vous pouvez directement mettre la fonction Debug() sous le nom de [

void serialEvent()

](https://www.arduino.cc/en/Tutorial/SerialEvent) et pas besoin de l’appeler alors dans la loop() c’est fait pour vous par l’environnement arduino (le main.cpp qui est caché par l’IDE appelle cette fonction à chaque tour de loop() si elle existe)

Si j’étais vous je ne n’utiliserai pas la classe String pour la fonction debugPrint... cf la discussion ici par exemple avec une macro et __VA_ARGS__

Y à t il un moyen de faire une interruption de sorte que dés que l’utilisateur tape la commande elle sot exécute? Car dans les 2 cas (void Debug() ou void serialEvent()), je ne peu activer la commande qu'à chaque tour de la loop. Ce qui suivant la charge du code donne une latence.
Pour la classe String, je vois souvent vos interventions sur le forum et j'ai également lu vos commentaires. Mais je me sent plus alaise avec les string.

Bonjour,

Tu testes si tu as reçu un caractère dans la fonctionDebugPrint et si c'est le cas tu le lis et positionne le flag debug en conséquence.