为Arduino创建库
Creating a Library for an Arduino
我有一些代码想放进一个使用另一个库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()
或invalid use of qualified-name 'MyLibrary::_serial'
这样的错误。
通过在.h文件中声明static SoftwareSerial _serial;
,并在.cpp文件顶部声明SoftwareSerial MyLibrary::_serial(4,5,false);
,我对它进行了一次编译。问题是,我想在MyLibrary的构造函数中设置_serial
的端口(这样我就可以创建一个为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
}
这种语法一开始可能看起来很奇怪,但尽管它并不那么漂亮,但它清楚地区分了变量的初始化与变量的操作,这是将初始化放在构造函数主体中可能会使其稍微模糊的地方。通常,除非使用此语法初始化成员变量,否则C++将调用默认构造函数,如果成员没有可调用的默认构造函数,则会导致编译错误。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 使用暂停按钮ARDUINO创建灯光序列时出现问题
- 如何在不知道Arduino中知道其大小的情况下创建数组和存储值
- 如何在Arduino中创建另一个类库的实例变量
- C++类创建"does not name a type"(使用 Arduino 和颜色传感器)
- Arduino Serial在哪里创建
- 如何在Arduino上为SD卡创建动态文件名
- 为Arduino创建库
- 如何在Arduino中从SD卡创建变量
- 如何在C++中创建一个返回字节数组的函数?Arduino项目
- 中断创建arduino库
- Arduino Uno代码创建不正确的时间值
- 需要帮助创建Arduino (c/c++)的无限数组
- 在Arduino草图文件夹中创建库
- C++:在Xcode中创建等效的Arduino 'byte'的方法