Serielles Debuging global deaktivieren

Hallo,

ich nutze aufgrund seiner Vielzahl an seriellen Anschlüssen sehr gerne und oft den Arduino Mega 2560. Ich nutze serielles Debugging und habe mir schon oft gewünscht, diese "Meldungen" nach erfolgtem Debugging global deaktivieren zu können. Ich würde also gerne so einfach wie möglich sämtliche print-Befehle am seriellen. Anschluss 0 deaktivieren können.

Geht das komfortabel und falls ja, wie?

Gruß Chris

Debugging ist für die Entwicklung wenn man es so möchte. Somit hat es im eigentlichen Programm später wenig zu suchen.

Mach doch einfach einen Schalter, der abgefragt wird. Alternativ, sobald der Arduino seriellen Input bekommt > 0 wird Debugging aktiviert.

Bedingte Kompilierung: http://www.c-howto.de/tutorial-praeprozessor-bedingte-kompilierung.html

define DEBUG

ifdef DEBUG

Serial.println(...);

endif

Dann kommentierst du einfach das Define aus und es wird gar nicht kompiliert.

Chris72622: Geht das komfortabel und falls ja, wie?

Du kannst einfach die Zeile mit "Serial.begin" auskommentieren, dann geht nichts mehr über die serielle Schnittstelle raus.

Wenn Du nicht nur die serielle Ausgabe vermeiden möchtest, sondern auch der Code aus dem Programm heraus soll, um z.B. eine kleinere Programmdatei zu erzeugen, müßtest Du mit bedingter Kompilierung arbeiten.

Alles klar. Danke!

Gruß Chris

Serenifly:

define DEBUG

Dann kommentierst du einfach das Define aus und es wird gar nicht kompiliert.

Jetzt habe ich doch noch zwei Fragen:

  1. Muss ich #define verwenden, oder geht es auch einfach mit boolean?
  2. Was bedeutet "..es wird gar nicht kompiliert" im Detail?

Danke.

Gruß Chris

Alles mit # läuft über Präprozessor: http://de.wikipedia.org/wiki/C-Pr%C3%A4prozessor

Das heißt, das wird vor dem Compilieren überprüft und nicht zur Laufzeit. Die Bedingungen werden ausgewertet und entsprechend sieht der Compiler anderen Code zum Übersetzen: http://de.wikipedia.org/wiki/C-Pr%C3%A4prozessor#Bedingte_Ersetzung

Du kannst auch normale Variablen verwenden. Dann wird das aber zur Laufzeit überprüft. Das hat auch seine Daseinsberechtigung, wenn du nicht jedesmal das Programm neu aufspielen willst um das Debuggen umzuschalten. Das könnte man z.B. über einen externen Schalter oder eine Serial-Eingabe machen.

Wie in dem anderen Link beschrieben geht es auch so:

#define DEBUG 0

#ifdef DEBUG > 0
Serial.println(...);
#endif

Mit DEBUG 0 ist das Debuggen augeschaltet und mit z.B. DEBUG 1 eingeschaltet. Das ist aber eher dafür gedacht, wenn man verschiedene Stufen hat (z.B. 0 (AUS), 1 und 2).

Ok- topp.

Dank Dir!

Gruß Chris

Ich hab das bei mir so definiert:

#define DEBUG    // Herauskommentieren, wenn keine serielle Ausgabe erwünscht wird

#ifdef DEBUG
  #define debug_print(x)  Serial.print(x)
  #define debug_println(x)  Serial.println(x)
  #define debug_begin(x) Serial.begin(x)
#else
  #define debug_print(x)
  #define debug_println(x) 
  #define debug_begin(x)
#endif

void setup () {
  debug_begin(57600);  
  debug_println("Hello world");
}

Anstatt Serial.print verwendet man dann einfach immer debug_print und wenn keine serielle Ausgabe erwünscht wird, einfach die erste Zeile herauskommentieren.

Das ist absolut fett!

Somit enfällt sehr viel Schreibaufwand, vor allem dann, wenn an vielen unterschiedlichen Stellen vereinzelt Serial.print (oder Serial.println) steht.

Aus meiner Sicht ein Riesentipp!

Herzlichen Dank!

Auch hierbei wird der Codeabschnitt bereits vor dem Compilieren überprüft und nicht erst zur Laufzeit, oder?

Ist es richtig, dass hierbei im Vergleich zur ersten von Serenifly geposteten Variante bei auskommentierter Debug-Zeile die Programmdatei größer wird, da ja weiterhin die Serial.print und Serial.println-Zeilen mitkompiliert werden?

Wäre es dann alternativ somit nicht viel sinnvoller, einfach nur (wie von jurs weiter oben bereits geschrieben) Serial.begin() auszukommentieren?

Gruß Chris

Makros dieser Art sind Text-Ersetzungen. Er ersetzt was links steht durch das rechts. Wenn Debug auskommentiert wurde ersetzt er es so wie ich verstehe durch nichts. Also wird auch nichts kompiliert.

Das ist sehr schön. Muss ich mir mal merken :)

Wäre es dann alternativ somit nicht viel sinnvoller, einfach nur (wie von jurs weiter oben bereits geschrieben) Serial.begin() auszukommentieren?

Das sind zwei verschiedene Ansätze
Spexx Lösung hat die Eigenschaft, dass der kompilierte Sketch gar keine debug-Ausgaben enthält. Ist also kleiner, evtl. sogar etwas schneller.
Wenn man dann später mal die Debug-Ausgaben brauchen sollte, muss man den Sketch allerdings erst mit
#define DEBUG
neu übersetzen und hochladen.
Der andere Ansatz ist eher eine Variante davon, den SerialMonitor nicht anzuschliessen, wenn man keine Ausgaben braucht.

Falls man sowohl “normale” wie “debug” Ausgaben hat, ist es übrigens eine gute Idee, TestAusgaben
stets über sowas wie debug_print(x) zu erzeugen, um sie gemeinsam zu/abschalten zu können.

Wenn man debug-Ausgaben dynamisch ( ohne Neukompilieren ) steuern will, empfliehlt sich,
eine globale Variable zu schaffen:

bool debug;   
die Macros:

#define debug_print(x) if(debug) Serial.print(x)
#define debug_println(x) if(debug) Serial.println(x)

sind immer bequem, weil x jeder Datentyp, incl. F(“Flashstring”), sein kann…

Wie debug gesetzt wird, ist dann eine andere Geschmackssache:
Nicht umsonst findet man schonmal so Tricks wie “Taster gedrückt halten während des Einschaltens”
um einen Testmodus zu aktivieren :wink: