ganz kurze Frage , zum "Debuggen" habe ich den Arduino ja am USB angeschlossen und benutze Serial.Println um mir etwas auszugeben.
Natürlich mache ich nicht jedesmal die Abfrage If Serial.available.
Wenn ich fertig bin soll der Arduino nur noch am Netzwerk angeschlossen sein.
Muss ich da nun die ganzen Serial.Println löschen oder auskommentieren oder kann ich die ohne Probleme drin lassen ?
Dann muss man nicht bei jeder einzelnen Ausgabe extra Anweisungen hinschreiben. Der Präprozessor ersetzt den Text dann einfach durch "nichts" und es wird nicht ausgeführt
Dann muss man nicht bei jeder einzelnen Ausgabe extra Anweisungen hinschreiben. Der Präprozessor ersetzt den Text dann einfach durch "nichts" und es wird nicht ausgeführt
Dann muss man nicht bei jeder einzelnen Ausgabe extra Anweisungen hinschreiben. Der Präprozessor ersetzt den Text dann einfach durch "nichts" und es wird nicht ausgeführt
Hallo,
danke euch für die vielen Antworten.
Das werd ich heute abend mal testen.
Ich hab noch nicht so viel Ahnung von der Arduino Sprache , kann ich den obigen Code direkt so nehmen oder muss da noch was geändert werden ... ich meine z.B. das hier: debugBegin(...) bleibt das so stehen oder müssen die 3 Punkte ersetzt werden?
Sorry für die blöde Frage, aber jeder hat mal angefangen
Ich kanns erst heute Abend testen...blöde Arbeit
Dann muss man aber bei jeder Ausgabe eine extra Abfrage hinschreiben. Das macht viel Arbeit und der Code wird unleserlich, da viele Zeilen entstehen die eigentlich nichts tun.
Das ist ein Fall wo Makros auch in C++ ihre Berechtigung haben
bleibt das so stehen oder müssen die 3 Punkte ersetzt werden?
Die Punkte sorgen dafür dass du eine beliebige Anzahl von Argumenten übergeben kannst. Man muss also nicht Versionen mit einem oder zwei Parametern unterscheiden
du hast schon recht, es war auch nicht so ernst gemeint und doch schon ernst gemeint.
Man will ja in C++ möglichst weg von Makro Orgien, damit es sicherer wird.
Allerdings wird dabei der Code unleserlicher, genau wie du sagst. Merkt man schnell mit den C++ cast Operatoren.
Am Ende muss man für sich entscheiden wieviel C++ man wirklich schreibt.
Ich muss aber auch zugeben, dass ich mich bei manchen neuen C++ Dingen auch frage, warum wird das immer komplizierter statt einfacher. Aber das ist ein anderes Thema.
Tommy56:
Gute Idee, aber wäre snprintf_P nicht sicherer?
Stimmt, wäre ja auch einfach, da der Puffer unmittelbar vorher im Makro definiert wird. Da kann man die Größe auch gleich bei snprintf_P mit angeben. Werde ich zukünftig so machen.
Doc_Arduino:
Man will ja in C++ möglichst weg von Makro Orgien, damit es sicherer wird.
Allerdings wird dabei der Code unleserlicher, genau wie du sagst.
Die Makro-Variante hat auch den Vorteil, dass ohne debug da gar kein Code generiert wird, und damit die Release-Version schlanker wird.
Ich nutze ähnliche Makros z.B. auch um in Interrupts Testpulse für den LA zu erzeugen. Da kann man ja keine Debug-Prints nutzen und es geht auch eher um Zeitmessungen. Da ist es schon gut, wenn da in der Release-Version der Testcode gar nicht vorhanden ist.
Auch in C++ hat der Präprozessor durchaus seine Berechtigung.
Doc_Arduino:
Das kann ich entkräften. Nimm mein Bsp. Code und vergleiche mit RELEASE Einstellung.
Klar, in so einem Mini-Code kann der Compiler das noch prima optimieren. Da brauche ich das aber eigentlich gar nicht.
Mach das mal bei einer Lib-Entwicklung, die aus vielen cpp-Dateien besteht ( Und wo Du das trotzdem zentral ein- bzw. ausschalten willst ). Mal abgesehen davon, dass deine Variante da schnell unübersichtlich wird. Mit den Makros bleibt es immer eine einzige Print-Zeile, die sich per '//' auch schnell mal lokal ausschalten lässt, während die anderen aktiv bleiben. Und auf den printf-Komfort möchte ich auch nicht verzichten.
Weiterer Vorteil: Wenn das Ganze für verschiedene Plattformen funktionieren soll, lässt sich das Makro zentral anpassen, die Print-Zeile im Code bleibt immer gleich.
das hat mit Mini Code gar nichts zu tun. Mir scheint du hast das noch nie probiert.
Ob ich nun zwei Striche tippe oder zwischen Debug/Release wechsel ist der Rede gar nicht wert.
Das der Rest im Code mehr Zeilen erfordert stimmt. Ist dafür astreines C++ und sauberes C++ erfordert generell mehr Tipperei.
Das Andere ist mir alles zu weit hergeholt. Ich weiß gar nicht was es mit einer Hochsprache bei einem Plattformwechsel für ein Problem geben soll - diesbezüglich. Eben weil es C++ Standard ist.
Am Ende ist es mir völlig egal ob jemand defines nimmt oder nicht. Ich hatte nur eine reine C++ Variante gezeigt. Mehr wollte ich auch nicht. Das war laut meiner Auffassung mit Serenifly schon alles klargestellt wurden.
Es gibt noch mehr reine C++ Lösungen für diese Problemlage, allerdings ist das "Arduino System" nicht sonderlich gut dafür vorbereitet.
Damit sind Defines schon ein recht effektiver Weg.
Diese Alternative hat vielleicht ein paar Features mehr, ist aber auch nicht wirklich schlank
#include <Streaming.h>
class DummyPrinter: public Print
{
public:
virtual size_t write(uint8_t) override
{
return 1;
}
} noDebug;
// such dir einen aus.. kann auch ein File, Lcd,
// oder irgendein anderer Stream sein
//Print &Debug {Serial};
//Print &Debug {Serial1};
Print &Debug {noDebug};
Print &DebugLevel1 {Serial};
void setup()
{
Serial.begin(9600);
Debug.print("Test"); Debug.println();
Debug.println(10.5459, 2);
Debug.println(1234);
DebugLevel1 << __FILE__ << " " << __DATE__ << endl;
}
void loop()
{
}