Scrittura della prima libreria - Oggetto flusso seriale


8

Ho realizzato diversi progetti con Arduino, ma non ho mai fatto altro che un "Hello World" in C. Sto scrivendo la mia prima biblioteca e molte cose orientate agli oggetti mi stanno venendo in mente. Comunque, la mia libreria funziona come dovrebbe, passo un float alla mia funzione e la formatta correttamente e la invia via seriale. Tuttavia, l'ho implementato in modo massiccio. La Guida allo stile dell'API di Arduino menziona un modo che sembra molto meglio:

Quando si utilizza la comunicazione seriale, consentire all'utente di specificare qualsiasi oggetto Stream, anziché "Serial" con codifica hardware. Ciò renderà la tua libreria compatibile con tutte le porte seriali su Mega e Due e può anche utilizzare interfacce alternative come SoftwareSerial. L'oggetto Stream può essere passato al costruttore della libreria o a una funzione begin () (come riferimento, non come puntatore). Vedi Firmata 2.3 o XBee 0.4 per esempi di ciascun approccio.

Qualcuno può approfondire come fare questo, o mostrarmi un po 'di codice?

Risposte:


9

Ecco un semplice esempio (creato e testato con un mega2560), con una classe a cui è possibile passare un oggetto Stream e invia un Hello su questo oggetto stream generico. Quando si costruisce l'oggetto, è possibile passare l'oggetto Stream che si desidera effettivamente comunicare:

#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();
}

NOTA: serial.println () non è l'oggetto globale seriale, notare le lettere minuscole, è la variabile di classe Stream interna.

Se si è confusi con OO e le classi, tenere presente (mentre si acquisiscono maggiori conoscenze al riguardo) che questo approccio può essere utilizzato anche con una semplice funzione, è possibile passare il parametro seriale. Inoltre, non è necessario cablare l'interfaccia seriale per sempre, è infatti possibile cambiare il tempo di esecuzione e utilizzare un canale diverso a seconda di alcune condizioni:

#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);
}

Puoi anche dichiarare il costruttore come MyProtocol (Stream & s = Serial): serial (s) {} sou non devi passare il Serial ma puoi farlo se lo desideri. Costruiresti quindi costruiresti l'oggetto proprio come MyProtocol p;
hithwen,

Grazie, è stato davvero utile, ci è voluto del lavoro ma l'ho capito. Puoi vedere il risultato sul mio Github .
ahalekelly,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.