Viết thư viện đầu tiên - Đối tượng truyền phát nối tiếp


8

Tôi đã thực hiện khá nhiều dự án với Arduino, nhưng chưa bao giờ thực hiện nhiều hơn một "Hello World" trong C. Tôi đang viết thư viện đầu tiên của mình và rất nhiều thứ hướng đối tượng đang diễn ra trong đầu tôi. Dù sao, thư viện của tôi đang hoạt động như mong muốn, tôi chuyển một float cho hàm của mình và nó định dạng đúng và gửi nó qua serial. Tuy nhiên, tôi đã thực hiện nó một cách vụng về. Các Arduino API Style Guide đề cập đến một cách mà dường như tốt hơn nhiều:

Khi sử dụng giao tiếp nối tiếp, cho phép người dùng chỉ định bất kỳ đối tượng Luồng nào, thay vì "Nối tiếp" mã hóa cứng. Điều này sẽ làm cho thư viện của bạn tương thích với tất cả các cổng nối tiếp trên Mega và đáo hạn và cũng có thể sử dụng các giao diện thay thế như SoftwareSerial. Đối tượng Stream có thể được chuyển đến hàm tạo của thư viện của bạn hoặc đến hàm start () (làm tham chiếu, không phải là con trỏ). Xem Firmata 2.3 hoặc XBee 0.4 để biết ví dụ về từng phương pháp.

Bất cứ ai có thể giải thích làm thế nào để làm điều này, hoặc cho tôi xem một số mã?

Câu trả lời:


9

Dưới đây là một ví dụ đơn giản (được xây dựng và thử nghiệm với mega2560), với một lớp có thể được truyền qua một đối tượng Stream và gửi Hello qua đối tượng luồng chung này. Khi xây dựng đối tượng, bạn có thể truyền đối tượng Stream mà bạn muốn thực sự giao tiếp:

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

LƯU Ý: serial.println () không phải là đối tượng toàn cầu Nối tiếp, lưu ý chữ thường, nó là biến lớp Stream bên trong.

Nếu bạn bối rối với OO và các lớp, hãy tính đến (trong khi bạn có thêm kiến ​​thức về nó) rằng phương pháp này cũng có thể được sử dụng với một hàm đơn giản, bạn có thể truyền tham số nối tiếp. Hơn nữa, không cần thiết phải cứng cáp giao diện Nối tiếp mãi mãi, trên thực tế bạn có thể chuyển đổi trong thời gian chạy và sử dụng một kênh khác tùy thuộc vào một số điều kiệ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);
}

Bạn cũng có thể khai báo hàm tạo là MyProtocol (Stream & s = serial): serial (s) {} sou bạn không cần truyền serial nhưng bạn có thể nếu bạn muốn. Bạn sẽ xây dựng sau đó xây dựng đối tượng giống như MyProtocol p;
hithwen

Cảm ơn, điều này thực sự hữu ích, nó đã mất một số công việc nhưng tôi đã tìm ra nó. Bạn có thể thấy kết quả trên Github của tôi .
ahalekelly
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.