debug für serial.print(ln)

Hi, suche gerade nach einer Möglichkeit meine Konsolenausgaben für "Debugmodus" ein- bzw. auszuschalten.

hab dazu im Internet folgendes gefunden:

#define DEBUG //"Schalter" zum aktivieren

#ifdef DEBUG
#define DEBUG_PRINT(x) Serial.print(x)
#define DEBUG_PRINT(x) Serial.println(x)
#else
#define DEBUG_PRINT(x)
#define DEBUG_PRINTLN(x)
#endif

Ist so was gängig, oder habt ihr bessere Ideen?

Sonst hab ich mich immer so abgequält:

if (debug==1) {
   serial.println("blablabla");
}

Aber das ist immer viel Müll im Code.

gruß/hk007

Die erste Version kompiliert die Prints nur wenn der Debugstatus aktiv ist. Außerdem ist sie etwas umständlich und fehlerhaft.
Sie ersetzt je nach Debugstatus "DEBUG_PRINT(x)" mit "Serial.print(x)" oder mit nichts "".
Das funktioniert nur wenn die Variable zum Ausgeben immer "x" ist. Außerdem wird Serial.prinln(x) nicht von Serial.print(x) unterschieden. Da müßte "DEBUG_PRINTLN(x)" stehen. Diese Methode erspart eine Kontrolle im Sketch.

Bessere ist im Sketch bei jedem debug-print zu kontrollieren ob die Debugvariable vorhanden ist oder nicht; also immer bei jeden Serial.print() oder Serial.println()
#ifdef DEBUG
Serial.print()
#endif

Die 2. Version kompiliert den Debugcode führt ihn aber nur bei aktiven Debugstatus aus.

Die Funktionen braucht es damit was ausgegeben wird. Natürlich ist das nicht schön und hilft auch nicht zur besseren Lesbarkeit beizutragen.
Meine erste korrigierte Version hat den vortei durch auskomentieren von "#define DEBUG" im Sketch auf dem Arduino keine Debugcodes zu haben ohne alle Debug-Prints auszukommentieren oder löschen zu müssen.

Grüße Uwe

Hi Uwe,

ja da ist ein Tipfehler. Sorry.
Sollte so heissen:

#define DEBUG //"Schalter" zum aktivieren

#ifdef DEBUG
#define DEBUG_PRINT(x) Serial.print(x)
#define DEBUG_PRINTLN(x) Serial.println(x)
#else
#define DEBUG_PRINT(x)
#define DEBUG_PRINTLN(x)
#endif

Das funktioniert nur wenn die Variable zum Ausgeben immer "x" ist.

??? Also ich kann damit auch z.B Text ausgeben:

DEBUG_PRINTLN("Server started");

Mir gefällt halt daran, daß ich im Sketch nicht für jede Debugausgabe 3 Zeilen habe.

hk007:
Hi Uwe,

ja da ist ein Tipfehler. Sorry.
...

Kein Problem.

hk007:

Das funktioniert nur wenn die Variable zum Ausgeben immer "x" ist.

??? Also ich kann damit auch z.B Text ausgeben:

DEBUG_PRINTLN("Server started");

Mir gefällt halt daran, daß ich im Sketch nicht für jede Debugausgabe 3 Zeilen habe.

Nein , der Precompiler sucht nach
"DEBUG_PRINTLN(x)" und ersetzt es mit "Serial.println(x)" oder "".

"DEBUG_PRINTLN("Server started");" ist da eine andere Suchstring der von "DEBUG_PRINTLN(x)" verschieden ist und darum nicht gefinden wird.

Probier es mal. Du wirst schon sehen ob es funktioniert oder nicht.

Grüße Uwe

Was andere so treiben kannst Du hier schauen:

uwefed:
"DEBUG_PRINTLN("Server started");" ist da eine andere Suchstring der von "DEBUG_PRINTLN(x)" verschieden ist und darum nicht gefinden wird.
Probier es mal. Du wirst schon sehen ob es funktioniert oder nicht.

Grad probiert:

// #define DEBUG //"Schalter" zum aktivieren

#ifdef DEBUG
#define DEBUG_PRINT(x) Serial.print(x)
#define DEBUG_PRINTLN(x) Serial.println(x)
#else
#define DEBUG_PRINT(x)
#define DEBUG_PRINTLN(x)
#endif
void setup()
{
   // start the serial for debugging
   Serial.begin(115200);
   // start the Ethernet connection and the server:
   Ethernet.begin(mac, serverIP);
   server.begin();
   DEBUG_PRINTLN("Server started");
   delay(500);

}
...

Das ergibt keine Ausgabe auf der Konsole.

Und das hier:

#define DEBUG //"Schalter" zum aktivieren

#ifdef DEBUG
#define DEBUG_PRINT(x) Serial.print(x)
#define DEBUG_PRINTLN(x) Serial.println(x)
#else
#define DEBUG_PRINT(x)
#define DEBUG_PRINTLN(x)
#endif
void setup()
{
   // start the serial for debugging
   Serial.begin(115200);
   // start the Ethernet connection and the server:
   Ethernet.begin(mac, serverIP);
   server.begin();
   DEBUG_PRINTLN("Server started");
   delay(500);

}
...

ergibt:
Server started auf der Konsole

Das ist jetzt wohl wieder mal "Theorie und Praxis" :stuck_out_tongue:

uwefed:

hk007:
Hi Uwe,

ja da ist ein Tipfehler. Sorry.
...

Kein Problem.

hk007:

Das funktioniert nur wenn die Variable zum Ausgeben immer "x" ist.

??? Also ich kann damit auch z.B Text ausgeben:

DEBUG_PRINTLN("Server started");

Mir gefällt halt daran, daß ich im Sketch nicht für jede Debugausgabe 3 Zeilen habe.

Nein , der Precompiler sucht nach
"DEBUG_PRINTLN(x)" und ersetzt es mit "Serial.println(x)" oder "".

"DEBUG_PRINTLN("Server started");" ist da eine andere Suchstring der von "DEBUG_PRINTLN(x)" verschieden ist und darum nicht gefinden wird.

Probier es mal. Du wirst schon sehen ob es funktioniert oder nicht.

Grüße Uwe

Also Uwe

Dass das (x) in der Konstante nur als Platzhalter dient solltest Du aber wissen. Das ist gängige Programmierpraxis in C.

MaFu:
Dass das (x) in der Konstante nur als Platzhalter dient solltest Du aber wissen. Das ist gängige Programmierpraxis in C.

Genau, ich bin zwar kein C++ Profi, aber funktionsähnliche Präprozessor-Makros, bei denen Parameter in runden Klammern übergeben werden, sind für unterschiedliche C/C++-Compiler gang und gäbe, nicht nur für AVC GCC. Und der Name des Parameters in so einem Makro ist auch nicht auf x oder nur einen Buchstaben beschränkt, sondern es sind beliebige Parameternamen wie auch überall sonst für die Namen von Funktionsparametern möglich.

oh oh....Blasphemie :zipper_mouth_face:

Aber ich glaube Uwe hat kein Problem damit. :slight_smile:

Heißt also, ich könnte das so machen wie gezeigt??

MaFu:
Also Uwe

Dass das (x) in der Konstante nur als Platzhalter dient solltest Du aber wissen. Das ist gängige Programmierpraxis in C.

Nein, wußte ich nicht. Man möge mir meine Unwissenheit bitte verzeihen...
Uwe

Wenn wir gerade schon beim Thema sind, kann ich mit einem Macro ein define definieren ?

Jomelo:
Wenn wir gerade schon beim Thema sind, kann ich mit einem Macro ein define definieren ?

ich sage dazu nichts :wink: :wink: