Go Down

Topic: debug für serial.print(ln) (Read 986 times) previous topic - next topic

hk007

Apr 01, 2013, 12:32 pm Last Edit: Apr 01, 2013, 12:34 pm by hk007 Reason: 1
Hi, suche gerade nach einer Möglichkeit meine Konsolenausgaben für "Debugmodus" ein- bzw. auszuschalten.

hab dazu im Internet folgendes gefunden:

Code: [Select]
#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:
Code: [Select]

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


Aber das ist immer viel Müll im Code.

gruß/hk007
Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

uwefed

#1
Apr 01, 2013, 12:48 pm Last Edit: Apr 01, 2013, 05:40 pm by uwefed Reason: 1
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

hk007

#2
Apr 01, 2013, 01:04 pm Last Edit: Apr 01, 2013, 01:08 pm by hk007 Reason: 1
Hi Uwe,

ja da ist ein Tipfehler. Sorry.
Sollte so heissen:
Code: [Select]
#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


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

??? Also ich kann damit auch z.B Text ausgeben:
Code: [Select]
DEBUG_PRINTLN("Server started");

Mir gefällt halt daran, daß ich im Sketch nicht für jede Debugausgabe 3 Zeilen habe.
Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

uwefed

#3
Apr 01, 2013, 01:32 pm Last Edit: Apr 01, 2013, 05:37 pm by uwefed Reason: 1

Hi Uwe,

ja da ist ein Tipfehler. Sorry.
...

Kein Problem.

Quote from: hk007

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

??? Also ich kann damit auch z.B Text ausgeben:
Code: [Select]
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


hk007


"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:

Code: [Select]
// #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:
Code: [Select]
#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:
Code: [Select]
Server started auf der Konsole

Das ist jetzt wohl wieder mal "Theorie und Praxis"  :P
Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

MaFu



Hi Uwe,

ja da ist ein Tipfehler. Sorry.
...

Kein Problem.

Quote from: hk007

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

??? Also ich kann damit auch z.B Text ausgeben:
Code: [Select]
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.
_______
Manfred

jurs


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.

hk007

oh oh....Blasphemie  :smiley-zipper:

Aber ich glaube Uwe hat kein Problem damit. :)

Heißt also, ich könnte das so machen wie gezeigt??
Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

uwefed

#9
Apr 01, 2013, 05:35 pm Last Edit: Apr 01, 2013, 05:39 pm by uwefed Reason: 1

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

Jomelo

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

uwefed


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

ich sage dazu nichts  ;) ;)

Go Up