Menulis Perpustakaan Pertama - Obyek Stream Serial

8

Saya telah melakukan beberapa proyek dengan Arduino, tetapi tidak pernah melakukan lebih dari "Hello World" di C. Saya sedang menulis perpustakaan pertama saya, dan banyak hal yang berorientasi objek melampaui kepala saya. Bagaimanapun, pustaka saya berfungsi sebagaimana mestinya, saya mengirimkan float ke fungsi saya dan memformatnya dengan benar dan mengirimkannya keluar melalui serial. Namun, saya menerapkannya dengan cara yang kikuk. The Arduino API Style Guide menyebutkan dengan cara yang tampaknya jauh lebih baik:

Saat menggunakan komunikasi serial, izinkan pengguna untuk menentukan objek Stream apa pun, alih-alih mengkodekan "Serial". Ini akan membuat perpustakaan Anda kompatibel semua port serial pada Mega dan Due, dan juga dapat menggunakan antarmuka alternatif seperti SoftwareSerial. Objek Stream dapat diteruskan ke konstruktor perpustakaan Anda atau ke fungsi begin () (sebagai referensi, bukan pointer). Lihat Firmata 2.3 atau XBee 0.4 untuk contoh dari setiap pendekatan.

Adakah yang bisa menguraikan cara melakukan ini, atau menunjukkan kepada saya beberapa kode?

ahalekelly
sumber

Jawaban:

9

Berikut adalah contoh sederhana (dibangun dan diuji dengan mega2560), dengan kelas yang dapat melewati objek Stream, dan mengirimkan Hello ke objek stream umum ini. Saat membuat objek, Anda bisa meneruskan objek Stream yang ingin Anda komunikasikan:

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

CATATAN: Serial.println () bukan objek Serial global, perhatikan huruf kecil, ini adalah variabel kelas Stream internal.

Jika Anda bingung dengan OO dan kelas, pertimbangkan (sementara Anda mendapatkan lebih banyak pengetahuan tentang itu) bahwa pendekatan ini dapat juga digunakan dengan fungsi sederhana, Anda dapat melewati parameter serial. Lebih jauh lagi, tidak perlu melakukan hardwire antarmuka Serial untuk selamanya, Anda sebenarnya dapat mengganti waktu berjalan dan menggunakan saluran yang berbeda tergantung pada beberapa kondisi:

#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
sumber
Anda juga dapat mendeklarasikan konstruktor sebagai MyProtocol (Stream & s = Serial): serial {} Anda tidak perlu melewati Serial tetapi Anda bisa jika Anda mau. Anda akan membangun kemudian membangun objek seperti MyProtocol p;
sampai
Terima kasih, ini benar-benar membantu, butuh beberapa pekerjaan tetapi saya mengetahuinya. Anda dapat melihat hasilnya di Github saya .
ahalekelly