Pages: [1]   Go Down
Author Topic: debug für serial.print(ln)  (Read 588 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 1
Posts: 353
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

hab dazu im Internet folgendes gefunden:

Code:
#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:
if (debug==1) {
   serial.println("blablabla");
}

Aber das ist immer viel Müll im Code.

gruß/hk007
« Last Edit: April 01, 2013, 05:34:47 am by hk007 » Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20181
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: April 01, 2013, 10:40:31 am by uwefed » Logged

Offline Offline
Sr. Member
****
Karma: 1
Posts: 353
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi Uwe,

ja da ist ein Tipfehler. Sorry.
Sollte so heissen:
Code:
#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:
DEBUG_PRINTLN("Server started");

Mir gefällt halt daran, daß ich im Sketch nicht für jede Debugausgabe 3 Zeilen habe.
« Last Edit: April 01, 2013, 06:08:56 am by hk007 » Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20181
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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
« Last Edit: April 01, 2013, 10:37:10 am by uwefed » Logged

0
Offline Offline
Faraday Member
**
Karma: 19
Posts: 3418
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Was andere so treiben kannst Du hier schauen:

http://stackoverflow.com/q/1644868/2036917
http://stackoverflow.com/q/1941307/2036917
Logged

Check out my experiments http://blog.blinkenlight.net

Offline Offline
Sr. Member
****
Karma: 1
Posts: 353
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

"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:
// #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:
#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:
Server started
auf der Konsole

Das ist jetzt wohl wieder mal "Theorie und Praxis"  smiley-razz
Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Munich/Germany
Offline Offline
God Member
*****
Karma: 9
Posts: 642
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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.
Logged

_______
Manfred

Germany S-H
Offline Offline
Edison Member
*
Karma: 117
Posts: 2436
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Sr. Member
****
Karma: 1
Posts: 353
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

oh oh....Blasphemie  smiley-zipper

Aber ich glaube Uwe hat kein Problem damit. smiley

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

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20181
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: April 01, 2013, 10:39:28 am by uwefed » Logged

Germany, Osnabrück
Offline Offline
God Member
*****
Karma: 25
Posts: 572
E-Technik Student - Master
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20181
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wenn wir gerade schon beim Thema sind, kann ich mit einem Macro ein define definieren ?
ich sage dazu nichts  smiley-wink smiley-wink
Logged

Pages: [1]   Go Up
Jump to: