Я использую 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);
Однако ни один из них не работал так, как я ожидал.
Вы пытаетесь вызвать функцию-член (то есть функцию, принадлежащую члену типа класса) без использования члена класса. Это означает, что обычно вы сначала создаете экземпляр члена вашего класса 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 ++, чтобы вы начали — Список книг
Удачи!
Вы должны передать аргументы для массажа, как указано в прототипе:
void message(const uint8_t *payload, size_t size, port_t port);
Поскольку массаж возвращает void, не следует использовать его в качестве аргумента для другой функции.
Я решил проблему, сделав функцию сообщения обычной функцией вне класса. Не уверен, что это хорошая практика — но это работает.
// 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);
}