Escrevendo a primeira biblioteca - objeto de fluxo serial

8

Eu fiz alguns projetos com o Arduino, mas nunca fiz mais do que um "Hello World" em C. Estou escrevendo minha primeira biblioteca, e muitas coisas orientadas a objetos estão passando por minha cabeça. De qualquer forma, minha biblioteca está funcionando como deveria, passo um float para minha função, formata-a corretamente e a envia por serial. No entanto, eu o implementei de maneira desajeitada. O Guia de Estilo da API do Arduino menciona uma maneira que parece muito melhor:

Ao usar a comunicação serial, permita ao usuário especificar qualquer objeto Stream, em vez de codificar "Serial". Isso tornará sua biblioteca compatível com todas as portas seriais do Mega e do Due e também poderá usar interfaces alternativas como o SoftwareSerial. O objeto Stream pode ser passado para o construtor da sua biblioteca ou para uma função begin () (como referência, não como ponteiro). Veja Firmata 2.3 ou XBee 0.4 para exemplos de cada abordagem.

Alguém pode elaborar sobre como fazer isso, ou me mostrar algum código?

ahalekelly
fonte

Respostas:

9

Aqui está um exemplo simples (criado e testado com um mega2560), com uma classe que pode ser transmitida a um objeto Stream e envia um Olá sobre esse objeto genérico de fluxo. Ao construir o objeto, você pode transmitir o objeto Stream que deseja realmente comunicar:

#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: O serial.println () não é o objeto global Serial; observe as letras minúsculas; é a variável interna da classe Stream.

Se você estiver confuso com o OO e as classes, leve em consideração (enquanto você obtém mais conhecimento sobre isso) que essa abordagem também pode ser usada com uma função simples, você pode passar o parâmetro serial. Além disso, não é necessário conectar a interface serial para sempre; na verdade, você pode alternar no tempo de execução e usar um canal diferente, dependendo de alguma condição:

#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
fonte
Você também pode declarar o construtor como MyProtocol (Stream & s = Serial): serial (s) {} sou que você não precisa passar no Serial, mas pode, se quiser. Você construiria e construiria o objeto como MyProtocol p;
hithwen 27/03
Obrigado, isso foi realmente útil, demorou algum trabalho, mas eu descobri. Você pode ver o resultado no meu Github .
ahalekelly