如何将修改 class 成员的 class 成员函数传递给采用函数指针的函数
How to pass a class member function that modifies class members to a function that takes a function pointer
我正在为 Arduino 供电的气象站编写软件。
我有一个 class 用于每个传感器系统(有些简单,有些复杂),雨量计需要使用 Arduino attachInterrupt
功能。
签名:
void attachInterrupt(uint8_t interruptNum, void (*userFunc)(), int mode)
这用于在引脚更改状态时执行回调,这会增加计数器(这是 class 的成员变量)。
我目前有:
// `pulses` and `pin` are member variables.
void RainGauge::begin()
{
pulses = 0;
attachInterrupt(digitalPinToInterrupt(pin), callback, FALLING);
}
我需要以某种方式定义回调。
由于捕获方面的原因,我试过了,但没有成功:
void RainGauge::begin()
{
pulses = 0;
auto callback = [this](void) {
pulses++;
};
attachInterrupt(digitalPinToInterrupt(pin), callback, FALLING);
}
这给出了错误 no suitable conversion function from "lambda []()->void" to "void (*)()" existsC/C++(413)
。
有什么办法吗?
问题是,中断发生时应该在什么对象上调用函数?
你可以这样做,例如:
class RainGauge {
int pulses;
public:
void begin(int pin, void (*callback)());
void increment();
};
void RainGauge::begin(int pin, void (*callback)())
{
pulses = 0;
attachInterrupt(digitalPinToInterrupt(pin), callback, FALLING);
}
void RainGauge::increment()
{
pulses++;
}
RainGauge RainGauge1;
RainGauge RainGauge2;
void setup() {
RainGauge1.begin(2, []() {RainGauge1.increment();});
RainGauge2.begin(3, []() {RainGauge2.increment();});
}
void loop() {
}
我正在为 Arduino 供电的气象站编写软件。
我有一个 class 用于每个传感器系统(有些简单,有些复杂),雨量计需要使用 Arduino attachInterrupt
功能。
签名:
void attachInterrupt(uint8_t interruptNum, void (*userFunc)(), int mode)
这用于在引脚更改状态时执行回调,这会增加计数器(这是 class 的成员变量)。
我目前有:
// `pulses` and `pin` are member variables.
void RainGauge::begin()
{
pulses = 0;
attachInterrupt(digitalPinToInterrupt(pin), callback, FALLING);
}
我需要以某种方式定义回调。
由于捕获方面的原因,我试过了,但没有成功:
void RainGauge::begin()
{
pulses = 0;
auto callback = [this](void) {
pulses++;
};
attachInterrupt(digitalPinToInterrupt(pin), callback, FALLING);
}
这给出了错误 no suitable conversion function from "lambda []()->void" to "void (*)()" existsC/C++(413)
。
有什么办法吗?
问题是,中断发生时应该在什么对象上调用函数?
你可以这样做,例如:
class RainGauge {
int pulses;
public:
void begin(int pin, void (*callback)());
void increment();
};
void RainGauge::begin(int pin, void (*callback)())
{
pulses = 0;
attachInterrupt(digitalPinToInterrupt(pin), callback, FALLING);
}
void RainGauge::increment()
{
pulses++;
}
RainGauge RainGauge1;
RainGauge RainGauge2;
void setup() {
RainGauge1.begin(2, []() {RainGauge1.increment();});
RainGauge2.begin(3, []() {RainGauge2.increment();});
}
void loop() {
}