Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为Arduino创建库_C++_Arduino - Fatal编程技术网

C++ 为Arduino创建库

C++ 为Arduino创建库,c++,arduino,C++,Arduino,我有一些代码,我想放进一个使用另一个库的库中。现在,我将SoftwareSerial.h和SoftwareSerial.cpp文件添加到与我正在创建的库相同的文件夹中 我的头文件如下所示: ifndef我的图书馆 定义我的图书馆 包括Arduino.h 包括SoftwareSerial.h 定义MyLibrary\u版本1//此库的软件版本 //定义所有类变量 定义数据缓冲区大小50//soft serial有63字节的缓冲区。 我的图书馆 { 公众: 我的库uint8端口输入,uint8端口输

我有一些代码,我想放进一个使用另一个库的库中。现在,我将SoftwareSerial.h和SoftwareSerial.cpp文件添加到与我正在创建的库相同的文件夹中

我的头文件如下所示:

ifndef我的图书馆 定义我的图书馆 包括Arduino.h 包括SoftwareSerial.h 定义MyLibrary\u版本1//此库的软件版本 //定义所有类变量 定义数据缓冲区大小50//soft serial有63字节的缓冲区。 我的图书馆 { 公众: 我的库uint8端口输入,uint8端口输出; float getSomeValueuint8\u t someu索引; 私人: 软件串行(u串行),; //不确定是否应该将下面的构造函数添加到上述声明中。 //uint8输入引脚=4,uint8输出引脚=5,布尔逻辑反向=false; float convertSomeValuebyte upperbyte,byte lowerbyte; 无效缓冲区; }; 恩迪夫 我的.cpp文件如下所示:

包括Arduino.h 包括我的图书馆 包括SoftwareSerial.h MyLibrary::MyLibraryuint8输入引脚,uint8输出引脚 { 布尔逻辑_反向=假; 此->串行输入引脚*,输出引脚*,逻辑反向; //我也尝试了下面的声明。 //SoftwareSerial\u serialin\u引脚*,out\u引脚*,逻辑反向; } float MyLibrary::getSomeValueuint8\u t传感器索引{ float someValue=1.1; 返回一些值; } float MyLibrary::convertSomebyte upperbyte,byte lowerbyte{ 浮点值=0.9; 返回一些值; } void MyLibrary::flushSerialBuffer{ //刷新串行缓冲区 而_.serial.available 字符c=_serial.read; } 我想成为我的图书馆中的一个私人领域,最好是静态的,但不是必需的,但我已经尝试了很多次,试图声明它,但似乎没有任何效果。我不断收到错误,比如调用“SoftwareSerial::SoftwareSerial”时没有匹配函数,或者限定名“MyLibrary::\u serial”使用无效

我通过声明静态SoftwareSerial(u serial)使它能够很好地编译一次;在my.h文件和SoftwareSerial MyLibrary中::_serial4,5,false;在我的.cpp文件的顶部。问题是,我想在MyLibrary的构造函数中设置_serial的端口,这样我就可以创建一个MyLibrary,为SoftwareSerial使用特定的in/out引脚,而不是在.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++将调用默认构造函数,如果成员没有可调用的默认构造函数,则会导致编译错误。

您需要让构造函数初始化如下:

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++将调用默认构造函数,这将导致编译错误,如果成员没有可调用默认构造函数。这正是我所要寻找的,这对于在MyLibrary的构造函数中初始化SofwareSerial非常有效。为了这里的完整性,如果我声明它为静态SoftwareSerial\u serial,我将如何初始化它;在我的头文件中?这是静态变量的良好实践吗?在构造函数中初始化它们对我来说似乎不太合适。我想你的意思是作为静态成员变量?在这种情况下,您可以选择一个要对象居住的.cpp文件,并使用SoftwareSerial DataLogger::_seriala,b;。对不起,我的图书馆::_seriala,b。虽然MyLibrary听起来更像是名称空间的名称,而不是类的名称……非常感谢,这正是我所寻找的,这对于在MyLibrary的构造函数中初始化SofwareSerial非常有效。为了这里的完整性,如果我声明它为静态SoftwareSerial\u serial,我将如何初始化它;在我的头文件中?这是静态变量的良好实践吗?在构造函数中初始化它们对我来说似乎不太合适。我想你的意思是作为静态成员变量?在这种情况下,您可以选择一个需要对象的.cpp文件 要在软件中生活并使用串行数据记录器::_seriala,b;。对不起,我的图书馆::_seriala,b。虽然MyLibrary听起来更像是名称空间而不是类的名称。。。