C++ 类函数的回调

标签 c++ class arduino lora

我正在使用 Arduino IDE 和 things network arduino 库来创建 LoRa 节点。

我创建了一个类来处理所有与 LoRa 相关的功能。在这个类中,如果我收到下行消息,我需要处理回调。 ttn 库有 onMessage 函数,我想在我的 init 函数中设置它并解析另一个函数,它是一个类成员,称为消息。 我收到错误“非静态成员函数的无效使用”。

// File: LoRa.cpp
#include "Arduino.h"
#include "LoRa.h"
#include <TheThingsNetwork.h>

TheThingsNetwork ttn(loraSerial,debugSerial,freqPlan);

LoRa::LoRa(){ 
}

void LoRa::init(){
  // Set the callback
  ttn.onMessage(this->message);
}

// Other functions

void LoRa::message(const uint8_t *payload, size_t size, port_t port)
{
  // Stuff to do when reciving a downlink
}

和头文件

// File: LoRa.h
#ifndef LoRa_h
#define LoRa_h

#include "Arduino.h"
#include <TheThingsNetwork.h>

// Define serial interface for communication with LoRa module
#define loraSerial Serial1
#define debugSerial Serial


// define the frequency plan - EU or US. (TTN_FP_EU868 or TTN_FP_US915)
#define freqPlan TTN_FP_EU868



class LoRa{
  // const vars



  public:
    LoRa();

    void init();

    // other functions

    void message(const uint8_t *payload, size_t size, port_t port);

  private:
    // Private functions
};


#endif

我试过:

ttn.onMessage(this->message);
ttn.onMessage(LoRa::message);
ttn.onMessage(message);

然而,它们都没有像我预期的那样工作。

最佳答案

您试图在不使用类成员的情况下调用成员函数(即属于类类型成员的函数)。这意味着,您通常要做的是首先实例化 LoRa 类的一个成员,然后像这样调用它:

LoRa loraMember;    
loraMember.message();

由于您试图从类本身内部调用该函数,而没有调用 init() 的类成员,因此您必须使该函数静态化,例如:

static void message(const uint8_t *payload, size_t size, port_t port);

然后你可以从任何地方使用 LoRa::message() 只要它是公开的,但是像这样调用它会给你另一个编译器错误,因为消息的接口(interface)要求“const uint8_t *payload, size_t size, port_t 端口”。所以你要做的就是像这样调用消息:

LoRa::message(payloadPointer, sizeVar, portVar);`

当你调用 ttn.onMessage(functionCall) 时,函数调用被评估,然后函数返回的内容被放入括号中,然后 ttn.onMessage 被调用。由于您的 LoRa::message 函数不返回任何内容(void),您会在此处遇到另一个错误。

我推荐一本关于 C++ 基础知识的好书来帮助您入门 - book list

祝你好运!

关于C++ 类函数的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44354908/

相关文章:

c++ - 如何使用 gettimeofday() 获取运行时间?

java - 可以使用重复继承来缩小类吗?

c++ - 在 C++ 中循环数组时访问结构属性

c++ - 来自 .h 和 .cpp 的条件编译

php - 由于 PHP 类,Internet Explorer 无法正确呈现页面

arduino - 如何使用arduino从sim900模块的RTC读取日期和时间数据?

c++ - 结构成员地址之间的差异作为编译时间常数

c++ - 使用 Boost JSON 解析器的 JSON 格式化错误

c++ - openMp:调用动态数组的共享引用时性能严重下降

c++ - << 运算符在 C++ 中不起作用