我一直试图将回调传递给Bluefruit库中的setConnectCallback()
函数。当我将函数名称connect_callback
传递给setConnectCallback()
时我收到错误invalid use of non-static member function of type 'void (AumeBluetooth::)()'
[setConnectCallback()
函数看起来像是在请求函数指针:
摘自Adafruit_BLE Arduino库:
/******************************************************************************/
/*!
@brief Set handle for connect callback
@param[in] fp function pointer, NULL will discard callback
*/
/******************************************************************************/
void Adafruit_BLE::setConnectCallback( void (*fp) (void) )
{
this->_connect_callback = fp;
install_callback(fp != NULL, EVENT_SYSTEM_CONNECT, -1);
}
我有一个这样定义的“ AumeBluetooth”类,我试图实现一个函数指针来调用connect_callback
:
。h
class AumeBluetooth {
public:
bool isConnected = false;
Adafruit_BluefruitLE_SPI *_ble;
void error(const __FlashStringHelper*err);
void begin();
AumeBluetooth();
void loop();
void connect_callback(void);
};
。cpp
#include "AumeBluetooth.h"
#include <SPI.h>
#include "Adafruit_BLE.h"
#include "Adafruit_BluefruitLE_SPI.h"
#include "Adafruit_BluefruitLE_UART.h"
#include "BluefruitConfig.h"
AumeBluetooth::AumeBluetooth() {
}
void AumeBluetooth::begin() {
isConnected = false;
Adafruit_BluefruitLE_SPI ble(BLUEFRUIT_SPI_CS, BLUEFRUIT_SPI_IRQ, BLUEFRUIT_SPI_RST);
_ble = &ble;
if ( !_ble->begin() )
{
error(F("Couldn't find Bluefruit, make sure it's in CoMmanD mode & check wiring?"));
}
_ble->echo(false);
_ble->info();
_ble->setMode(BLUEFRUIT_MODE_DATA);
void (AumeBluetooth::*cc)(void) = &AumeBluetooth::connect_callback;
ble.setConnectCallback(this->*cc);
}
void AumeBluetooth::connect_callback(void) {
Serial.print("BLUETOOTH IS CONNECTED");
isConnected = true;
}
}
Not sure what to do try next. Thanks!
setConnectCallback正在寻找静态函数指针。如错误消息所述,您正在向其传递非静态函数指针。
您的回调函数必须是静态函数-自由函数或专门指定为“静态”的类函数,因此无法访问类变量。
这是一个棘手的API,因为它看起来也像函数参数列表是(void),这意味着您没有办法传入索引或指针来将其绑定到类实例。您只能获得一个针对静态函数的回调,而代码则取决于该回调可能针对的类实例。
因此,您的connect_callback函数将无法在回调中设置类变量isConnected。您将只能访问全局/静态变量。
我希望begin()和loop()函数调用也是静态的非类函数。似乎您正在尝试将类包装器放到不一定是类的代码周围。