我有一些代码,我想放入一个使用另一个库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
Run Code Online (Sandbox Code Playgroud)
我的.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();
}
Run Code Online (Sandbox Code Playgroud)
我希望SoftwareSerial成为MyLibrary中的一个私有字段(最好是静态但不是必需的),但是我尝试了许多声明它但似乎没有任何效果.我一直得到错误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文件的顶部,我得到了一次编译.问题是,我想_serial在MyLibrary的构造函数中设置端口(所以我可以创建一个使用SoftwareSerial的特定输入/输出引脚的MyLibrary),而不是在.cpp文件的顶部显式声明它们.
我不熟悉C编码和Arduino所以如果有人可以向我解释如何在.h文件中正确声明这些并使用MyLibrary构造函数或MyLibrary.begin中的正确端口实现它们,那将是一个很大的帮助. ()函数(或类似的东西).
在此先感谢您的有用评论.
你需要的是让你的构造函数进行如下初始化:
class MyLibrary{
public:
MyLibrary(uint8_t, uint8_t);
//...
private:
SoftwareSerial _serial;
//...
};
MyLibrary::MyLibrary(uint8_t in, uint8_t out)
: _serial(in, out)
{
//do initialization
}
Run Code Online (Sandbox Code Playgroud)
这个语法起初可能看起来很奇怪,但是它虽然不是很漂亮,但它明确区分变量的初始化与变量操作,这是将初始化放置在构造函数体内的东西可能会略微模糊.通常,除非您使用此语法初始化成员变量,否则C++将调用默认构造函数,如果该成员没有可调用的默认构造函数,则会导致编译错误.