Escribir la primera biblioteca: objeto de secuencia en serie

8

He realizado bastantes proyectos con Arduino, pero nunca he hecho más que un "Hello World" en C. Estoy escribiendo mi primera biblioteca, y muchas de las cosas orientadas a objetos se me pasan por la cabeza. De todos modos, mi biblioteca funciona como se supone que debe hacerlo, paso un flotador a mi función y lo formatea correctamente y lo envía por serie. Sin embargo, lo implementé de una manera torpe. La Guía de estilo de la API de Arduino menciona una forma que parece mucho mejor:

Cuando utilice la comunicación en serie, permita que el usuario especifique cualquier objeto Stream, en lugar de codificar "Serial". Esto hará que su biblioteca sea compatible con todos los puertos seriales en Mega y Due, y también puede usar interfaces alternativas como SoftwareSerial. El objeto Stream se puede pasar al constructor de su biblioteca o a una función begin () (como referencia, no como puntero). Ver Firmata 2.3 o XBee 0.4 para ejemplos de cada enfoque.

¿Alguien puede dar detalles sobre cómo hacer esto o mostrarme algún código?

ahalekelly
fuente

Respuestas:

9

Aquí hay un ejemplo simple (construido y probado con un mega2560), con una clase a la que se le puede pasar un objeto Stream, y envía un saludo sobre este objeto stream genérico. Al construir el objeto, puede pasar el objeto Stream que desea comunicar realmente:

#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: El serial.println () no es el objeto global en serie, tenga en cuenta la minúscula, es la variable de clase Stream interna.

Si está confundido con el OO y las clases, tenga en cuenta (mientras adquiere más conocimiento al respecto) que este enfoque también se puede utilizar con una función simple, puede pasar el parámetro en serie. Además, no es necesario cablear la interfaz serial para siempre, de hecho, puede cambiar el tiempo de ejecución y usar un canal diferente dependiendo de alguna condición:

#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
fuente
También puede declarar el constructor como MyProtocol (Stream & s = Serial): serial (s) {} porque no necesita pasar el Serial pero puede hacerlo si lo desea. Construiría y luego construiría el objeto tal como MyProtocol p;
hithwen
Gracias, esto fue realmente útil, tomó algo de trabajo pero lo descubrí. Puedes ver el resultado en mi Github .
ahalekelly