使用attachInterrupt时没有匹配的函数错误

时间:2012-01-27 00:21:20

标签: arduino interrupt

我的最新Arduino项目代码出现了一点错误,该代码使用TimerOne library在4位7段显示屏上显示数字。我使用一个中断使微处理器不断地在每个数字之间轻弹,因为它们基本上连接在一起。

如果我将所有代码保存在主PDE文件中,我的代码工作正常,但我认为最好将显示器隔离在自己的类中。

我的编译器在PDE中遇到以下代码的第二行有问题:

Timer1.initialize(500);
Timer1.attachInterrupt(digitDisplay.flashDigit,500); 

attachInterrupt中的第二个arg应该是可选的, 我有没有尝试过这个!无论如何我得到以下错误:

DigitDisplayTest.cpp: In function 'void setup()':
DigitDisplayTest:29: error: no matching function for call to     'TimerOne::attachInterrupt(<unresolved overloaded function type>)'
C:\Program Files (x86)\arduino-0022\arduino-0022\libraries\Timer1/TimerOne.h:62: note: candidates are: void TimerOne::attachInterrupt(void (*)(), long int)

在DigitDisplay中(其中digitDisplay是一个实例),我按如下方式定义flashDigit:

class DigitDisplay
{
  private:
    /*...*/
  public:
    /*...*/
    void flashDigit();
}

void DigitDisplay::flashDigit()
{ 
  wipeDisplay();
  for (int i = 0; i < _digitCount ; i++)
  {
    if ( i == _digit ) digitalWrite( _digitPins[i], HIGH );
    else digitalWrite( _digitPins[i], LOW );
  }
  displayNumber(_digits[_digit]);
  _digit++ ;
  _digit %= _digitCount; 
}

如果您需要更多代码,请告诉我,但我很确定flashDigit()方法的gubbings没有任何问题 - 它确实在我将它放入自己的类之前有效。

显然,我可以通过添加

来规避这个错误
void Interrupt()
{
   digitDisplay.flashDigit();
}

到主PDE并附加该功能,但这只是一个解决方法,如果我可以直接调用它会很好。

我看到错误与制作一个函数指针(其中一个不存在因此错误)有关,但是指针不是我的强点所以我真的可以用手对它进行排序。

2 个答案:

答案 0 :(得分:3)

你非常接近。问题是成员函数(flashDigit())与函数(void function())不同。成员函数是一个可以在运行时更改的函数的ptr,与编译时已知的函数不同。 (因此关于未解析的函数类型的错误消息)。 有两个“工作”。你指出的第一个包络函数。第二,如果函数不需要利用类实例的唯一成员值,则可以将成员函数声明为static。

static void flashDigit();

This is described in more detail in section 33.1-33.3 of the Cline's C++ FAQ

答案 1 :(得分:1)

我在Arduino TWI库中遇到了同样的问题并指定了回调函数。 所以我创建了一个静态包装函数来调用类对象。

在我的.h档案中,我有:

#ifndef Classname
#define Classname
class Classname {
  pubic:
    void receiveEvent(int numBytes);
    static void receiveEvent_wrapper(int numBytes);
};
#endif

在我的.cpp文件中我有:

#include "Classname.h" 
void* pt2Object;

void Classname::receiveEvent_wrapper (int numBytes){
   // explicitly cast to a pointer to Classname
   Classname* mySelf = (Classname*) pt2Object;

   // call member
   mySelf->receiveEvent(numBytes);
}

现在我调用包装函数

详情及完整说明:http://www.newty.de/fpt/callback.html#static