Kann ich den Arduino dazu bringen, den seriellen Druck zu ignorieren?


8

Ich mag serielle Kommunikation zu Debugging- und Testzwecken, aber nach einer Weile nimmt sie der Skizze zu viel Geschwindigkeit.

Ist es möglich, dass der Arduino serial.print und serial.println in meinem Code ignoriert, ohne ihn in einen Kommentar umzuwandeln oder jeden seriellen Druck in "if (debug == true)" -Anweisungen zu platzieren?

Danke im Voraus.

Antworten:


14

Wenn Sie auf Spitzenleistung bestehen, ist es am besten, dafür ein Makro zu verwenden:

#define Sprintln(a) (Serial.println(a))

Dann statt

Serial.println(F("Hello world!"));

schreiben

Sprintln(F("Hello world!"));

usw. Um den SerialDruckvorgang zu deaktivieren , definieren Sie das Makro leer:

#define Sprintln(a) 

Dadurch entfernt der Präprozessor den gesamten mit definierten Debugging-Code Sprintlnaus Ihrem Code.

(Natürlich gibt es eine Vielzahl von Variationen zu diesem Thema.)


Sie können auch alle austretenden Drucke umwickeln #ifdef ENABLE_PRINTund #endifdann definieren oder kommentieren Sie #define ENABLE_PRINTan der Spitze der ur - Datei
portforwardpodcast

Sie können sogar eine Debug - Ebene und definieren Makros für Set debugL1();, debugL2();etc, so können Sie wählen , wie viele Details , die Sie auf „log“ wollen. Die Makros machen es zwar nicht möglich, die Laufzeit zu ändern, aber mit dem Vorteil, dass kein Laufzeit-Overhead vorliegt.
Paul

7

Sie können beispielsweise den Präprozessor verwenden, um alles Serialin Ihrem Code zu ändern .

#ifndef ENABLE_PRINT
// disable Serial output
#define Serial SomeOtherwiseUnusedName
static class {
public:
    void begin(...) {}
    void print(...) {}
    void println(...) {}
} Serial;
#endif

1

Eine weitere Lösung besteht darin, ein serielles Dummy-Gerät zu implementieren. Dies wäre eine Klasse, die als HardwareSerial von Stream erbt und die erforderlichen virtuellen Elementfunktionen mit Dummy-Funktionen implementiert.

class NullSerial : public Stream {
public:
  virtual size_t write(uint8_t) { return (1); }
  virtual int available() { return (0); }
  virtual int read() { return (0); }
  virtual int peek() { return (0); }
  virtual void flush() {}
  ...
  void begin(unsigned long, uint8_t) {}
  void end() {}
  ...
};

NullSerial Serial;

Da Serial nicht als schwaches Symbol definiert ist, müsste die Anwendung eine Steam-Variable für die Ausgabe verwenden. Und binden Sie dies an das HardwareSerial oder das NullSerial.

#if defined(DEBUG)
Stream& trace = Serial;
#else
NullSerial noSerial;
Stream& trace = noSerial;
#else

#endif
...
trace.print(42);

Dies ist nicht vollständig, da alle HardwareSerial-Elementfunktionen (die in der Skizze verwendet werden) benötigt werden, gibt jedoch eine allgemeine Vorstellung davon, wie OOP zur Lösung des Problems verwendet werden kann.

Prost!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.