Portierung von Arduino Zero auf Uno - class Uart?

Hi,

ich versuche gerade, eine Anwendung, die auf einem Zero pro entwickelt wurde und die Uart-Klasse benutzt, auf einen Uno zu portieren. Da gibt es die Klasse Uart scheinbar nicht - welche generische Klasse für die UART-Schnittstelle kann ich benutzen, die auf beiden Arduinos (Zero und Uno) einsetzbar ist? Die Anwendung erwartet eine Referenz auf ein Uart-Objekt, um serielle Kommunikation zu betreiben.

Gibt es HardwareSerial auf dem Zero nicht ?

(Wenn nicht, warum nennt er sich dann Arduino? :wink: )

Doch, HardwareSerial gibt es. Ich will auf dem Uno aber SoftwareSerial benutzen, damit der serielle Monitor benutzbar bleibt.

Ich habe jetzt versucht, per Preprozessor eine Umgehung zu schreiben:

#ifdef SoftwareSerial_h
#define SERIALCLASS SoftwareSerial
#else
#define SERIALCLASS Uart
#endif

...

void somefunction(SERIALCLASS &serial)
{
...
}

Da motzt die IDE aber:

error: ‘Uart’ was not declared in this scope: “#define SERIALCLASS Uart”

Und das, obwohl oberhalb ein #include <SoftwareSerial.h> steht. :confused:

Der gemeinsame Vorfahr von Serial und SoftSerial ist Print.
Ob das auf deinem Zero auch so ist?

Print ist nur die eine Richtung, da ist write() drin definiert. Dazu muss noch Stream kommen, für available(), read() usw.

Geht also nicht so einfach.

Ich habe nach einigem Experimentieren fast den Verdacht, dass mich hier (mit dem #ifdef-Konstrukt) eine Macke der IDE erwischt. Das #ifdef wird scheinbar nur lokal beachtet, wenn überhaupt. Wenn ich aus einem INO-File in der IDE eine Library benutze, in der das #ifdef steckt, werden die #defines nacheinander ausgeführt, ohne beachten des #ifdef darum.

Genausowenig nützt mir ein lokales #define SERIALCLASS SoftwareSerial im INO - in den Library-Files ist es bei der Compilierung nicht definiert.

Miq1:
Ich habe nach einigem Experimentieren fast den Verdacht, dass mich hier (mit dem #ifdef-Konstrukt) eine Macke der IDE erwischt

Korrekt. #define mit bedingter Kompilierung macht Probleme weil der Arduino Parser nicht macht was man denkt. Der bearbeitet einfach alle Includes obwohl er es gar nicht soll

Schreib mal das ganz oben hin:

#if 1
__asm volatile ("nop");
#endif

Print ist nur die eine Richtung, da ist write() drin definiert. Dazu muss noch Stream kommen, für available(), read() usw.

Stream& passt. Dann kann man sowohl HardwareSerial als auch SoftwareSerial übergeben. Außerdem File aus der SD Library.

Und Stream ist eine Unterklasse von Print wodurch man alles von Print bekommt

@Serenifly: Danke, das klappt. :slight_smile: