最初のライブラリの作成-シリアルストリームオブジェクト


8

私はArduinoでかなりの数のプロジェクトを実行しましたが、Cで「Hello World」以上のことをしたことがありません。最初のライブラリを書いています。多くのオブジェクト指向のものが頭を悩ませています。とにかく、私のライブラリは想定どおりに機能しています。浮動小数点数を関数に渡し、適切にフォーマットしてシリアル経由で送信します。しかし、私はそれを不格好な方法で実装しました。ArduinoのAPIスタイルガイドは、はるかに良いと思われる方法を言及します:

シリアル通信を使用する場合、ユーザーが「シリアル」をハードコーディングするのではなく、任意のStreamオブジェクトを指定できるようにします。これにより、ライブラリはMegaおよびDueのすべてのシリアルポートと互換性があり、SoftwareSerialなどの代替インターフェイスを使用することもできます。Streamオブジェクトは、ライブラリのコンストラクターまたはbegin()関数に(ポインターではなく参照として)渡すことができます。各アプローチの例については、Firmata 2.3またはXBee 0.4を参照してください。

誰でもこれを行う方法について詳しく説明したり、コードを見せたりできますか?

回答:


9

以下は、Streamオブジェクトを渡すことができるクラスを使用し、この汎用ストリームオブジェクトを介してHelloを送信する簡単な例(mega2560で構築およびテスト)です。オブジェクトを構築するときに、実際に通信する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クラス変数です。

OOとクラスが混同されている場合は、この方法が単純な関数でも使用できることを考慮に入れて(知識を深めながら)、シリアルパラメーターを渡すことができます。さらに、シリアルインターフェイスを永遠に配線する必要はありません。実際には、実行時に切り替えて、いくつかの条件に応じて異なるチャネルを使用できます。

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

コンストラクターをMyProtocol(Stream&s = Serial):serial(s){}として宣言することもできます。シリアルを渡す必要はありませんが、必要に応じて渡すことができます。MyProtocol pと同じように、オブジェクトをビルドしてからビルドします。
hithwen 14年

おかげで、これは本当に役に立ちました、それはいくつかの作業を要しましたが、私はそれを理解しました。結果は私のGithubで確認できます。
ahalekelly 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.