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 中的一个私有字段(最好是静态的,但不是必需的),但我尝试了很多方法来声明它,但似乎没有任何效果。我不断收到类似no matching function for call to 'SoftwareSerial::SoftwareSerial()or的错误invalid use of qualified-name 'MyLibrary::_serial'

static SoftwareSerial _serial;通过在我的 .h 文件和SoftwareSerial MyLibrary::_serial(4,5,false);.cpp 文件的顶部声明,我让它编译好一次。问题是,我想_serial在我的构造函数中为 MyLibrary 设置端口(这样我就可以创建一个使用 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 回答