Écriture de la première bibliothèque - Objet de flux série

8

J'ai fait pas mal de projets avec Arduino, mais je n'ai jamais fait plus qu'un "Hello World" en C. J'écris ma première bibliothèque, et beaucoup de choses orientées objet me passent par la tête. Quoi qu'il en soit, ma bibliothèque fonctionne comme prévu, je passe un float à ma fonction et il la formate correctement et l'envoie en série. Cependant, je l'ai implémenté de manière maladroite. Le Guide de style de l'API Arduino mentionne un moyen qui semble beaucoup mieux:

Lors de l'utilisation de la communication série, autorisez l'utilisateur à spécifier n'importe quel objet Stream, plutôt que de coder en dur "Serial". Cela rendra votre bibliothèque compatible avec tous les ports série sur Mega et le Due, et peut également utiliser des interfaces alternatives comme SoftwareSerial. L'objet Stream peut être passé au constructeur de votre bibliothèque ou à une fonction begin () (comme référence, pas comme pointeur). Voir Firmata 2.3 ou XBee 0.4 pour des exemples de chaque approche.

Quelqu'un peut-il expliquer comment procéder ou me montrer du code?

ahalekelly
la source

Réponses:

9

Voici un exemple simple (construit et testé avec un mega2560), avec une classe à laquelle on peut passer un objet Stream, et envoie un Hello sur cet objet stream générique. Lors de la construction de l'objet, vous pouvez passer l'objet Stream que vous souhaitez réellement communiquer:

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

REMARQUE: serial.println () n'est pas l'objet global Serial, notez les minuscules, c'est la variable de classe Stream interne.

Si vous êtes confus avec l'OO et les classes, prenez en compte (pendant que vous en apprenez plus) que cette approche peut également être utilisée avec une fonction simple, vous pouvez passer le paramètre série. De plus, il n'est pas nécessaire de câbler l'interface série pour toujours, vous pouvez en fait basculer en temps d'exécution et utiliser un canal différent en fonction de certaines conditions:

#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
la source
Vous pouvez également déclarer le constructeur comme MyProtocol (Stream & s = Serial): serial (s) {} sou vous n'avez pas besoin de passer le Serial mais vous pouvez si vous le souhaitez. Vous construisez puis construisez l'objet exactement comme MyProtocol p;
hithwen
Merci, c'était vraiment utile, cela a pris un peu de travail mais je l'ai compris. Vous pouvez voir le résultat sur mon Github .
ahalekelly