2012-11-01 202 views
1

我有一些代码,我想投入它使用另一个库,SoftwareSerial库。现在我将SoftwareSerial.h和SoftwareSerial.cpp文件添加到我创建的库所在的文件夹中。创建一个图书馆一个Arduino

我的头文件看起来是这样的:

#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()invalid use of qualified-name 'MyLibrary::_serial'的错误。

我通过在我的.h文件中声明static SoftwareSerial _serial;,并在我的.cpp文件的顶部声明SoftwareSerial MyLibrary::_serial(4,5,false);来编译好。问题是,我想设置的_serial端口在我的构造函数在MyLibrary(这样我就可以创建一个使用特定的输入/输出引脚SoftwareSerial一个在MyLibrary),而不是让他们在.cpp文件的顶部显式声明。

我对C编码和Arduino不是很熟悉,所以如果有人能向我解释如何在.h文件中正确地声明这些文件并将它们与MyLibrary构造函数中的正确端口一起实例化或一个MyLibrary.begin()函数(或类似的东西)。

预先感谢您有益意见。

回答

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 
} 

这句法可能看起来很奇怪在第一,但尽管它是不是很漂亮,它明确区分的初始化变量VS​​对变量操作,这恐怕是将初始化在构造函数体可以使略显模糊。作为一项规则,除非你使用这个语法来初始化成员变量,C++会调用默认的构造函数,这将导致一个编译错误,当且仅当该成员不具有可调用默认的构造函数。

+0

太感谢你了,这正是我一直在寻找,这工作得很好对在MyLibrary的构造函数初始化SofwareSerial。为了完整起见,如果我在头文件中声明它为'static SoftwareSerial _serial;',我将如何初始化它?这是甚至用静态变量的好习惯吗?在构造函数中初始化它们对我来说看起来不太合适。 – methodMan

+0

我假设你的意思是一个静态成员变量?在这种情况下,您需要选择一个.cpp文件,您希望该对象“存活”并使用“SoftwareSerial DataLogger :: _ serial(a,b);'。 –

+1

对不起'MyLibrary :: _ serial(a,b)'。虽然MyLibrary听起来更像是一个名字空间的名字,而不是一个类... –

相关问题