Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 创建arduino库时的中断_C++_Arduino - Fatal编程技术网

C++ 创建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); } ... 当我尝试它时,会出现

我正在为能量计数器创建一个库。我想计算能量计数器产生的脉冲,并通过arduino将其转换为能量。为了捕捉任何脉搏,我想使用arduino中断。我希望它易于使用:

#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();
   //...
};