2017-06-04 27 views
0

私はArduino IDEと物事ネットワークarduinoライブラリを使ってLoRa moteを作成しています。クラス関数へのC++コールバック

すべてのLoRa関連の関数を処理するクラスを作成しました。このクラスでは、私がダウンリンクメッセージを受け取った場合、コールバックを処理する必要があります。 ttnライブラリには、init関数で設定するonMessage関数があり、メッセージと呼ばれるクラスメンバである別の関数を解析します。 「非静的メンバー関数の無効な使用」というエラーが表示されます。

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

非スタティックメンバ関数は、*オブジェクト*を呼び出す必要があります。オブジェクトがない場合は、非静的メンバー関数を使用することはできません。オブジェクトを取得したら、['std :: function'](http://en.cppreference.com/w/cpp/utility/functional/function)と[' std :: bind']( http://en.cppreference.com/w/cpp/utility/functional/bind)。 –

答えて

0

Iメッセージ機能をクラス外の通常の機能にすることで問題を解決しました。それが良い習慣であるかどうかは分かりませんが、うまくいきます。

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

プロトタイプによって示されるようにあなたはマッサージに引数を渡す必要があります。

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

マッサージはvoidを返すので、probabaly他の関数の引数として使用すべきではありません。

2

クラスメンバを使用せずにメンバ関数(つまり、クラス型のメンバに属する関数)を呼び出そうとしています。あなたがメンバーなしで、クラス自体の内部からその関数を呼び出すようにしようとしているので

LoRa loraMember;  
loraMember.message(); 

:それはあなたが通常行うだろうことのようにそれを呼び出して、最初のクラスLORAのメンバーをインスタンス化され、意味しますinitを呼び出すクラス()、あなたのような機能を静的に行う必要があります。そして、あなたがLORAを使用することができます

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

::どこにでもいる限り、それは国民の通りからのメッセージ()が、ちょうどそのようにそれを呼び出すとなりますメッセージのインターフェイスが "const uint8_t * payload、size_t size、port_t port"を要求するので、別のコンパイラエラーです。それでは、あなたがしなければならないと思いますがような呼び出しメッセージです:あなたは何が起こることは、関数呼び出しが評価されることをであるttn.onMessage(関数呼び出し)を呼び出すと

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

、その後、何がその関数によって返される入れますカッコにttn.onMessageが呼び出されます。あなたのLoRa :: message関数は何も返さないので(void)、別のエラーが発生します。

私はあなたが始めるためにC++の基礎に良い本を示唆 - book list

幸運を!

関連する問題