C++ 创建arduino库时的中断
我正在为能量计数器创建一个库。我想计算能量计数器产生的脉冲,并通过arduino将其转换为能量。为了捕捉任何脉搏,我想使用arduino中断。我希望它易于使用:C++ 创建arduino库时的中断,c++,arduino,C++,Arduino,我正在为能量计数器创建一个库。我想计算能量计数器产生的脉冲,并通过arduino将其转换为能量。为了捕捉任何脉搏,我想使用arduino中断。我希望它易于使用: #include <EnergyCounter.h> #define counterPin 2; // interrupt code 0 in Uno EnergyCounter counter; void setup(){ counter.begin(counterPin); } ... 当我尝试它时,会出现
#include <EnergyCounter.h>
#define counterPin 2; // interrupt code 0 in Uno
EnergyCounter counter;
void setup(){
counter.begin(counterPin);
}
...
当我尝试它时,会出现以下错误:
error: cannot convert 'EnergyCounter::countPulse' from type 'void (EnergyCounter::)()' to type 'void (*)()'
attachInterrupt(0, countPulse, RISING);
^
Erro ao compilar.
这是否意味着我不能将某个方法用作中断服务例程(ISR)?
如何解决该问题,同时又能为库提供一个易于使用的界面?每脉冲增量需要是一个静态函数(参见签名) 因此,将其标记为静态:
static void increment_per_pulse();
在EnergyCounter类中,将countPulse定义为静态方法,如下所示:
class EnergyCounter{
//...
static void countPulse();
//...
};
原因:ISR应该是一个返回void且没有参数的函数。类成员函数有一个(隐藏)参数,即对类实例的引用
另一种解决方案是将countPulse移到EnergyCounter之外,使其成为全局名称空间中的常规方法(不是任何类的一部分)。您是否尝试了attachInterrupt(digitalPinToInterrupt(0),countPulse,RISING)代码>?我试过了,但也有同样的错误。把函数放在类之外怎么样?我认为这是一个转换问题。你能给我举个例子吗?在类之外定义函数
void countPulse(){display+=increment\u per\u pulse;}
class EnergyCounter{
//...
static void countPulse();
//...
};