Debuggung- Variablenausgabe variabel ein- und ausschalten

Hallo,

ich nutze gerne folgende, vielen bekannten Codezeilen fürs Debugging:

#define DEBUG

#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

Leider kommte ich jedoch immer mal wieder an den Punkt, an dem ich in Pseudocode gesprochen so etwas bräuchte:

debug_print(masterCard[i], HEX);

Leider führt dies zu Fehlermeldungen.

Wie realisiert ihr die Darstellung von Variablen via ein- und ausschaltbarem Debugging?

Sorry, für meine laienhafte Wortwahl. Ich hoffe, man kann es trotzdem verstehen.

Gruß Chris

Ich verwende diese Methode:
(habs mal mit deinen HEX probiert, tuts)

#define DEBUG Serial // debugging aktivieren

//  aus meiner debug.h entnommen
  #ifdef DEBUG
    #define debug(...) DEBUG.print(__VA_ARGS__)
    #define debugln(...) DEBUG.println(__VA_ARGS__)
    #define debugbegin(...) DEBUG.begin(__VA_ARGS__)
  #else
    #define debug(...)
    #define debugln(...)
    #define debugbegin(...)
  #endif
// ende debug.h


void setup() 
{

  debugbegin(9600);  
}

void loop() 
{
  debugln(millis(),HEX);
  delay(2000);
}

Hi,

mache das ein wenig anders.

Ich definiere mir eine globale Variable, die für alle Funktionen sichtbar ist.

Debug=1;

In der Debug-Ausgabe frage ich die Variable ab, ob sie gesetzt ist. Wenn ja, gebe ich
das Debugging aus, wenn nicht dann nicht.

Nachteil : Man braucht mehr Speicher, der Sketch wird größer.

Vorteil : Ich kann das Debugging einschalten, ohne den Arduino neu zu starten. Oder bei einem Tastendruck oder einem anderen Ereignis.

Viele Wege führen nach Rom …

Was combie beschrieben hat nennt sich "variadische Makros".Da kann man eine beliebige Anzahl an Parametern übergeben :slight_smile:

Hat das irgendwelche Nachteile?

Funktioniert super.

Danke combie (Karma++).

Gruß Chris

Danke für die Blumen!

Eigentlich sind mir keine Nachteile bekannt.
Funktioniert auch super mit andern Seriellen, SoftSerial usw...

Das sind immer noch ganz normale Makros, d.h. Textersetzungen. "..." und VA_ARGS dient nur dazu dass der Prä-Prozessor mehrere Parameter erkennt und einsetzt.

Eine andere Anwendung dazu ist für die Übergabe der Parameterliste an printf()

#define DEBUG Serial // debugging aktivieren

//  aus meiner debug.h entnommen
  #ifdef DEBUG
    #define debug(...) DEBUG.print(__VA_ARGS__)
    #define debugln(...) DEBUG.println(__VA_ARGS__)
    #define debugbegin(...) DEBUG.begin(__VA_ARGS__)
  #else
    #define debug(...)
    #define debugln(...)
    #define debugbegin(...)
  #endif
// ende debug.h

Wie krieg ich dann sowas verwuschtet?

debug << endl << F("Abrufe: “) << abrufe << F(” Gesamt: ") << millis() - currentMillis << endl;

Makros sind nichts anderes als Text-Ersetzungen! Was du links übergibst wird rechts eingesetzt.

Das geht genauso:

Die einzige Ausnahme sind eben Kommas, weil der Prä-Prozessor z.B. aus "debug(456, HEX)" zwei Parameter macht. Der Streaming Operator geht dagegen auch ohne variadische Makros.

Die Klammern warens. und man muss den << rausnehmen
Falsch:
debug << endl << F("Abrufe: “) << abrufe << F(” Gesamt: ") << millis() - currentMillis << endl;
Richtig:
debug (endl << F("Abrufe: “) << abrufe << F(” Gesamt: ") << millis() - currentMillis << endl);

Gut zu wissen fur die Zukunft. Hab mir da teilweise auch immer einen abgebrochen mit if(debug)