1

別のライブラリSoftwareSerialを使用するライブラリに入れたいコードがいくつかあります。ここで、SoftwareSerial.h および SoftwareSerial.cpp ファイルを、作成中のライブラリと同じフォルダーに追加しました。

私のヘッダーファイルは次のようになります。

#ifndef MyLibrary_h
#define MyLibrary_h

#include "Arduino.h"
#include "SoftwareSerial.h"

#define MyLibrary_VERSION       1       // software version of this library


//DEFINE ALL CLASS VARIABLES

#define DATA_BUFFER_SIZE 50  //soft serial has 63 byte buffer.

class MyLibrary
{
    public:
        MyLibrary(uint8_t port_in, uint8_t port_out);
        float getSomeValue(uint8_t some_index);
    private:
        SoftwareSerial _serial;
                //Not sure if I should add the constructors below to the above declaration.
                //(uint8_t in_pin=4, uint8_t out_pin=5, bool logic_reversed = false);
        float convertSomeValue(byte upperbyte, byte lowerbyte);
        void flushSerialBuffer();
}; 

#endif

私の .cpp ファイルは次のようになります。

#include "Arduino.h"
#include "MyLibrary.h"
#include "SoftwareSerial.h"


MyLibrary::MyLibrary(uint8_t in_pin, uint8_t out_pin)
{

    bool logic_reversed = false;
    this->_serial(in_pin*, out_pin*, logic_reversed);
        //I tried the declaration below as well.
    //SoftwareSerial _serial(in_pin*, out_pin*, logic_reversed);
}

float MyLibrary::getSomeValue(uint8_t sensor_index) {
    float someValue = 1.1;
    return someValue;
}

float MyLibrary::convertSome(byte upperbyte, byte lowerbyte) {
    float someValue = 0.9;
    return someValue;
}

void MyLibrary::flushSerialBuffer() {
    //Flush serial buffer
    while(_serial.available())
        char c = _serial.read();
}

SoftwareSerialを MyLibrary のプライベート フィールドにしたいのですが (できれば static ですが、必須ではありません)、多くのことを宣言してみましたが、何も機能していないようです。no matching function for call to 'SoftwareSerial::SoftwareSerial()またはのようなエラーが発生し続けinvalid use of qualified-name 'MyLibrary::_serial'ます。

static SoftwareSerial _serial;.h ファイルとSoftwareSerial MyLibrary::_serial(4,5,false);.cpp ファイルの先頭で宣言することで、一度コンパイルできました。問題は、MyLibrary のコンストラクターでポートを設定し_serial(SoftwareSerial の特定の入出力ピンを使用する MyLibrary を作成できるようにするため)、.cpp ファイルの先頭で明示的に宣言しないようにしたいということです。

私は C コーディングと Arduino にあまり詳しくないので、.h ファイルでこれらを適切に宣言し、MyLibrary コンストラクターまたは MyLibrary.begin で正しいポートを使用してそれらをインスタンス化する方法を誰かが説明してくれれば、非常に助かります。 () 関数 (またはそのようなもの)。

有益なコメントをお寄せいただきありがとうございます。

4

1 に答える 1

5

必要なのは、コンストラクターに次のように初期化を行わせることです。

class MyLibrary{
public:
   MyLibrary(uint8_t, uint8_t);
   //...
private:
   SoftwareSerial _serial;
   //...
};

MyLibrary::MyLibrary(uint8_t in, uint8_t out)
   : _serial(in, out)
{
   //do initialization
}

この構文は最初は奇妙に思えるかもしれませんが、それほどきれいではありませんが、変数の初期化と変数の操作を明確に区別しています。これは、初期化をコンストラクターの本体に配置すると、少しあいまいになる可能性があるためです。原則として、この構文を使用してメンバー変数を初期化しない限り、C++ は既定のコンストラクターを呼び出します。メンバーに呼び出し可能な既定のコンストラクターがない場合、コンパイル エラーが発生します。

于 2012-11-01T02:39:53.750 に答える