Frage:
Ermitteln Sie zur Kompilierungszeit, ob Serial1 und Serial2 definiert sind
Passiday
2018-06-11 17:03:26 UTC
view on stackexchange narkive permalink

Ich habe meine Bibliothek, die Serial , Serial1 und Serial2 verwendet, um verschiedene Protokollierungsszenarien einzurichten. Der Bibliotheksbenutzer würde die Konfiguration im Klassenkonstruktor unter Verwendung einfacher Bytekonstanten wie 0, 1 und 2 definieren.

Das Problem ist, dass Serial1 und Serial2 dies nicht sind in allen Boardtypen erhältlich. Wenn ich also meinen Code (der auf Mega gut kompiliert werden kann) auf Uno kompiliere, erhalte ich den Fehler 'Serial1' wurde in diesem Bereich nicht deklariert .

Ich denke also, ich muss ihn anpassen Mein Code mit Präprozessor-Direktive wie #if defined , um nur dann Code aufzunehmen, wenn Serial1 definiert ist. Dies würde jedoch nicht funktionieren, da Serial1 später zur Kompilierungszeit definiert wird. Was ist der akzeptierte Weg, dies zu tun?

Ich bin mir nicht sicher, ob das SDK über eine bestimmte Hardware verfügt, die das Setup für Dinge wie eine serielle Schnittstelle definiert. Die meisten betrachten die Prozessordefinitionen des SDK, die bedingte Kompilierungsanweisungen wie "#ifdef ARDUINO_AVR_UNO" definieren und verwenden.
Außerdem schaue ich mir den [ArduinoBoardManager im Github-Quellcode] (https://github.com/backupbrain/ArduinoBoardManager) an und sehe nicht, wo sie Hardware wie die serielle Schnittstelle pro Prozessor definieren. Vielleicht könnten Sie das hinzufügen und diesen Code wiederverwenden. Ich denke jedoch immer noch, dass der einfachste Weg darin besteht, den seriellen Portcode auszuwählen, den Sie basierend auf dem Prozessortyp kompilieren möchten. Schauen Sie sich den Quellcode in diesem Github-Projekt an, um zu sehen, wie sie das gemacht haben.
Warum sollte der Konstruktor nicht eine Objektreferenz vom Typ "Seriell" (oder "HardwareSerial" oder sogar "Drucken") verwenden?
Zwei antworten:
Juraj
2018-06-11 17:27:59 UTC
view on stackexchange narkive permalink

HardwareSerial.h im Kern der Arduino AVR-Karten definiert HAVE_HWSERIALX

Beispiel

  #ifndef HAVE_HWSERIAL1 # enthält "SoftwareSerial.h" SoftwareSerial Serial1 (6, 7); // RX, TX # endif  
st2000
2018-06-11 17:35:15 UTC
view on stackexchange narkive permalink

Betrachten Sie den hier im ArduinoBoardManager-Projekt bei github verwendeten Ansatz . Die Datei ArduinoBoardManager.h verwendet die bedingte Kompilierung, um den richtigen zu kompilierenden Code basierend auf dem Prozessortyp zu ermitteln. Ein ähnlicher Ansatz kann verwendet werden, um zu beurteilen, ob bestimmte Hardware-Peripheriegeräte wie serielle Schnittstellen basierend auf dem Prozessortyp verfügbar waren.

  #if defined (__ AVR_ATmega328P__) // uno, fi // Code kompatibel mit einem definierten Arduino Uno # elif (__ AVR_ATmega1280__) || defined (__ AVR_ATmega2560__) // Code kompatibel mit einem Arduino Mega # endif  
Warum tun Sie es, wenn HardwareSerial.h es für Sie erledigt? und zum Beispiel hat Uno Wifi zusätzliche hw Serial1 (um eine integrierte esp8266 anzuschließen), selbst wenn es sich um eine 328p handelt
Oh, ich stimme zu - ich wusste nichts über die Alternativen, bis ich hier gepostet habe. Ich wusste nur, wie das ArduinoBoardManager-Projekt damit umging.


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 4.0-Lizenz, unter der er vertrieben wird.
Loading...