Написание первой библиотеки - объект последовательного потока

8

Я сделал довольно много проектов с Arduino, но никогда не делал ничего, кроме «Hello World» на C. Я пишу свою первую библиотеку, и многие объектно-ориентированные вещи идут мне на ум. В любом случае, моя библиотека работает так, как и должно быть, я передаю плавающее значение своей функции, и она форматирует ее должным образом и отправляет через последовательный порт. Однако я реализовал это неуклюже. В Arduino API Style Guide упоминается способ, который выглядит намного лучше:

При использовании последовательной связи разрешите пользователю указывать любой объект Stream, а не жестко кодировать «Serial». Это сделает вашу библиотеку совместимой со всеми последовательными портами на Mega и Due, а также может использовать альтернативные интерфейсы, такие как SoftwareSerial. Объект Stream может быть передан в конструктор вашей библиотеки или в функцию begin () (в качестве ссылки, а не указателя). См. Firmata 2.3 или XBee 0.4 для примеров каждого подхода.

Кто-нибудь может уточнить, как это сделать, или показать мне код?

ahalekelly
источник

Ответы:

9

Вот простой пример (созданный и протестированный с помощью mega2560), с классом, которому можно передать объект Stream и отправить Hello через этот универсальный объект потока. При создании объекта вы можете передать объект Stream, с которым вы хотите связаться:

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

ПРИМЕЧАНИЕ: serial.println () не является глобальным объектом Serial, обратите внимание на нижний регистр, это внутренняя переменная класса Stream.

Если вы запутались с ОО и классами, примите во внимание (хотя вы получаете больше знаний об этом), что этот подход также можно использовать с простой функцией, вы можете передать параметр serial. Кроме того, нет необходимости постоянно устанавливать последовательный интерфейс, вы можете переключаться во время выполнения и использовать другой канал в зависимости от некоторых условий:

#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
источник
Вы также можете объявить конструктор как MyProtocol (Stream & s = Serial): serial (s) {} sou, вам не нужно передавать Serial, но вы можете, если хотите. Вы должны построить, а затем построить объект так же, как MyProtocol p;
hithwen
Спасибо, это было действительно полезно, потребовалась некоторая работа, но я понял это. Вы можете увидеть результат на моем Github .
ahalekelly