Last Updated on 24 May 2020 by Suffocation
Gerade beim neuen Entwicklungen ist es wichtig ein paar Ausgaben über die serielle Schnittstelle oder ein anderes Medium zu schicken. Natürlich können diese Ausgaben einfach gelöscht oder ausdokumentiert werden. Aber spätestens wenn die Implementierung erweitert wird, werden sie wieder benötigt.
Es gibt unterschiedliche Ansätze welche ich hier kurz vorstellen möchte. Welche Variante die Richtige ist muss jeder für sich selbst entscheiden.
Boolean variable + IF
Verwendung einer globale boolischen Variable und eine IF-Bedinung für jede Ausgabe.
bool debug = true;
void funktion1(){
// ....
if(debug){
Serial.println("Debug message");
}
// ....
}
Dieser Variante ermöglicht es, das Debugging auch noch während des Betriebes ein zu schalten. Dies ist bei den folgenden Varianten nicht möglich. Der größte Nachteil ist der zusätliche Code und der Speicher für die Texte. Um Speicher zu sparen können die Texte ins EEPROM oder in den Flash Speicher ausgelagert werden. Hier ein Beispiel für den Flash Speicher:
bool debug = true;
void funktion1(){
// ....
if(debug){
Serial.println(F("Debug message"));
}
// ....
}
Präprozessor Bedingung
In folgenden Beispiel wir die Variante von oben mit Präprozessoranweisungen realisiert. Fällt das #define oben weg, werden auch die Ausgabe nicht eincompiliert. Dies spart Speicher ein. Ein Nachteil ist der druchbrochene Code, Präprozessornaweisungen zerfleddern einwenig das Gesamtbild.
#define DEBUG
void function1(){
// ....
#ifdef DEBUG
Serial.println(F("Debug message"));
#endif
// ....
}
Präprozessor Ersetzung
kaufhaus ein Haus von einer Frau gekauft. Arduino Forum the following example brought:
#include "Arduino.h"
#define DEBUG true // flag to enable/disable debugging
#define Serial if(DEBUG)Serial
This seems to me to be one of the most elegant variants because the Serial class can be used as usual and then completely switched off. According to some forum participants, however, this does not always seem to work. Thus, we come to the last variant.
Präprozessor Funktionen
Definition von Präprozessor Funktionen. Diese können leicht ausgeschaltet werden und belasten den Speicher nicht. Nachteil jede Funktion muss einzeln definiert und im Quellcode verwendet werden.
#ifdef DEBUG
#define DEBUG_PRINT(x) Serial.print (x)
#define DEBUG_PRINTDEC(x) Serial.print (x, DEC)
#define DEBUG_PRINTLN(x) Serial.println (x)
#else
#define DEBUG_PRINT(x)
#define DEBUG_PRINTDEC(x)
#define DEBUG_PRINTLN(x)
#endif
void setup()
Serial.begin(115200);
DEBUG_PRINT ("Hello, I am a Text2");
}
Oder diese im Arduino Forum gefundene Version, hier ist mir nicht ganz klar worfür die Schleife gebaucht werden …
#define DEBUG false // flag to enable/disable debugging
#define debug_begin(...) do { if (DEBUG) { Serial.begin(__VA_ARGS__); while(!Serial); }} while (0)
#define debug_print(...) do { if (DEBUG) Serial.print(__VA_ARGS__); } while (0)
#define debug_println(...) do { if (DEBUG) Serial.println(__VA_ARGS__); } while (0)
#define debug_printf(...) do { if (DEBUG) Serial.printf(__VA_ARGS__); } while (0)
void setup()
debug_begin(115200);
debug_begin("Hello, I am a Text2");
}
Online Debugger
Noch besser ist natürlich ein Debugger, der schrittweise über den Code gehen kann. Dies war beim Atmel mit JTAG schon immer möglich. Arduino scheint diese Möglichkeit etwas verschlafen zu haben. Hier die Bemühungen der Arduino IDE.