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

Sma*_*Man 5 arduino interrupt

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

如果我把它全部保存在主PDE文件中,我的代码可以正常工作,但我认为最好将显示器隔离在自己的类中.

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

Timer1.initialize(500);
Timer1.attachInterrupt(digitDisplay.flashDigit,500); 
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

在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; 
}
Run Code Online (Sandbox Code Playgroud)

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

显然,我可以通过添加来规避这个错误

void Interrupt()
{
   digitDisplay.flashDigit();
}
Run Code Online (Sandbox Code Playgroud)

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

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

jdh*_*jdh 3

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

static void flashDigit();

Cline 的 C++ FAQ 第 33.1-33.3 节对此进行了更详细的描述