Erste Bibliothek schreiben - Serielles Stream-Objekt

8

Ich habe einige Projekte mit Arduino gemacht, aber nie mehr als eine "Hallo Welt" in C. Ich schreibe meine erste Bibliothek und viele objektorientierte Dinge gehen mir über den Kopf. Wie auch immer, meine Bibliothek funktioniert wie es soll, ich übergebe einen Float an meine Funktion und sie formatiert ihn richtig und sendet ihn über die Seriennummer. Ich habe es jedoch auf klobige Weise implementiert. Der Arduino API Style Guide erwähnt einen Weg, der viel besser zu sein scheint:

Erlauben Sie dem Benutzer bei Verwendung der seriellen Kommunikation, ein beliebiges Stream-Objekt anzugeben, anstatt "Seriell" fest zu codieren. Dadurch wird Ihre Bibliothek mit allen seriellen Schnittstellen von Mega und Due kompatibel und es können auch alternative Schnittstellen wie SoftwareSerial verwendet werden. Das Stream-Objekt kann an den Konstruktor Ihrer Bibliothek oder an eine Funktion begin () übergeben werden (als Referenz, nicht als Zeiger). Beispiele für jeden Ansatz finden Sie in Firmata 2.3 oder XBee 0.4.

Kann jemand näher darauf eingehen oder mir Code zeigen?

ahalekelly
quelle

Antworten:

9

Hier ist ein einfaches Beispiel (erstellt und getestet mit einem mega2560) mit einer Klasse, die ein Stream-Objekt übergeben kann und ein Hallo über dieses generische Stream-Objekt sendet. Beim Erstellen des Objekts können Sie das Stream-Objekt übergeben, das Sie tatsächlich kommunizieren möchten:

#include "Arduino.h"

class MyProtocol
{
public:
    MyProtocol(Stream& s):serial(s){}
    void send(){
        serial.println("Hello");
    }
private:
    Stream& serial;
};

MyProtocol p(Serial);

void setup() {
    Serial.begin(9600);
}

void loop() {
    delay(1000);
    p.send();
}

HINWEIS: Die Datei serial.println () ist kein globales serielles Objekt. Beachten Sie, dass es sich um die interne Stream-Klassenvariable handelt.

Wenn Sie mit dem OO und den Klassen verwechselt werden, berücksichtigen Sie (während Sie mehr darüber erfahren), dass dieser Ansatz auch mit einer einfachen Funktion verwendet werden kann. Sie können den seriellen Parameter übergeben. Darüber hinaus ist es nicht erforderlich, die serielle Schnittstelle für immer fest zu verdrahten. Sie können tatsächlich die Laufzeit umschalten und je nach Bedingung einen anderen Kanal verwenden:

#include "Arduino.h"

void send(Stream& serial){
    serial.println("Hello");
}

void setup() {
    Serial.begin(9600);
    Serial1.begin(9600);
}

void loop() {
    delay(1000);
    if(someCondition)
        send(Serial);
    else
        send(Serial1);
}
Drodri
quelle
Sie können den Konstruktor auch als MyProtocol (Stream & s = Serial) deklarieren: serial (s) {} Sie müssen die Serial nicht übergeben, können dies aber, wenn Sie möchten. Sie würden das Objekt dann genauso erstellen wie MyProtocol p;
Hithwen
Danke, das war wirklich hilfreich, es hat einige Arbeit gekostet, aber ich habe es herausgefunden. Sie können das Ergebnis auf meinem Github sehen .
Ahalekelly