C ++回调类函数

时间:2017-06-04 14:01:09

标签: c++ class arduino lora

我使用Arduino IDE和物联网arduino库来创建LoRa mote。

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

// 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);

然而,没有一个像我预期的那样工作。

3 个答案:

答案 0 :(得分:2)

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

LoRa loraMember;    
loraMember.message();

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

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

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

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

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

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

祝你好运!

答案 1 :(得分:0)

如原型所示,您应该将参数传递给按摩:

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

由于按摩返回无效,因此不应将其用作其他功能的参数。

答案 2 :(得分:0)

我通过使消息函数成为类外的正常函数来解决问题。不确定这是不是好的做法 - 但它确实有效。

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

TheThingsNetwork ttn(loraSerial,debugSerial,freqPlan);

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

LoRa::LoRa(){ 
}

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