C ++ обратный вызов функции класса

Я использую IDE Arduino и сетевую библиотеку Arduino для создания вещей для LoRa.

Я создал класс, который должен обрабатывать все функции, связанные с 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_EU868class LoRa{
// const varspublic:
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);

Однако ни один из них не работал так, как я ожидал.

0

Решение

Вы пытаетесь вызвать функцию-член (то есть функцию, принадлежащую члену типа класса) без использования члена класса. Это означает, что обычно вы сначала создаете экземпляр члена вашего класса 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 ++, чтобы вы начали — Список книг

Удачи!

2

Другие решения

Вы должны передать аргументы для массажа, как указано в прототипе:

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

Поскольку массаж возвращает void, не следует использовать его в качестве аргумента для другой функции.

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);
}
0
По вопросам рекламы [email protected]