如何在我自己的Arduino库中使用外部库?

时间:2018-06-27 05:33:33

标签: c++ arduino avr hardware-programming

晚上好!

我正在写一个Arduino库。在其中,我想从另一个需要实例化其构造函数的库中实例化一个对象,但是我不想对此类参数进行硬编码。我需要一些有关如何执行此操作的指导。

到目前为止,这是我代码的相关部分:

HSBC_CAN.h:

class HSBC_CAN {

    public:
        HSBC_CAN(uint8_t, uint8_t);

    private:
        uint8_t _int_pin;

};

HSBC_CAN.cpp:

#include <HSBC_CAN.h>
#include <mcp_can.h>

extern MCP_CAN *canbus_esc;

HSBC_CAN::HSBC_CAN(uint8_t int_pin, uint8_t cs_pin) {

    _int_pin = int_pin;
    canbus_esc = new MCP_CAN(cs_pin);

}

要清楚一点,从MCP_CAN类实例化对象的方法是MCP_CAN foo(int bar),其中bar是SPI协议的芯片选择引脚号。我希望我的库实例化MCP_CAN类的对象,但是从新类HSBC_CAN实例化对象时,我需要能够传递芯片选择引脚号。这是我在上面的代码中得到的错误:

error: request for member 'begin' in 'canbus_esc', which is of pointer type 'MCP_CAN*' (maybe you meant to use '->' ?)

我在示例代码中所做的方式可能是完全错误的(使用extern关键字和new运算符),但这正是我的主意ATM产生的结果。

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

来自编译器的错误消息非常有用,如果您遵循其建议,将.替换为->,则可能会解决您的直接问题。由于canbus_esc是一个指针,因此在访问其成员或函数之前必须先取消引用它。因此,如果它具有一个名为begin且可以使用零参数调用的函数,则可以编写:

canbus_esc->begin();

该行等效于:

(*canbus_esc).begin();

也请在定义extern的行上删除单词canbus_esc,否则将得到未定义的引用错误。

但是,您提供的代码有两个问题:首先,您正在使用new,它可以动态分配内存。如果可能的话,最好避免在小型设备(如AVR)上动态分配内存,因为在实际运行程序之前,您永远都不知道这些分配是否会失败(您可能会在程序的其他部分使用过多的内存) )。其次,您在文件范围内定义了canbus_esc,因此只能是其中之一。这意味着您不能真正创建多个HSBC_CAN对象;第二个将覆盖第一个创建的canbus_esc。尽管这对您的应用程序可能很好,但这似乎是不必要的限制。

我建议改为这样编写您的代码:

头文件:

#include <mcp_can.h>
class HSBC_CAN {
public:
  HSBC_CAN(uint8_t int_pin, uint8_t cs_pin);
  void begin();
private:
  uint8_t _int_pin;
  MCP_CAN can;
};

源文件:

#include <HSBC_CAN.h>

HSBC_CAN::HSBC_CAN(uint8_t int_pin, uint8_t cs_pin)
  : can(cs_pin)  // This line constructs the MCP_CAN object
{
  _int_pin = int_pin;
}

HSBC_CAN::begin()
{
  can.begin(42, 42, 42);  // TODO: fix arguments
}

另一个更好的想法是让您的HSBC_CAN对象获取一个指向MBC_CAN对象的指针,并将该指针作为成员变量存储在HSBC_CAN类中。如果要使用该MBC_CAN对象与CAN总线上的多个设备进行通讯,则该选项非常有意义。您可以通过指针使用单个MBC_CAN对象拥有多个类。