如何将修改 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() {

}