我的最新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并附加该功能,但这只是一个解决方案,如果我可以直接调用它会很好.
我看到错误是与制作一个函数指针(其中一个不存在因此错误),但指针不是我的强点,所以我真的可以用手对它进行排序.
你们非常接近。问题是成员函数 (flashDigit()) 与函数 (void function()) 不同。成员函数是指向可以在运行时更改的函数的 ptr,这与编译时已知的函数不同。(因此出现有关未解析的函数类型的错误消息)。有两个“解决方法”。您指出的第一个包络函数。其次,如果函数不需要利用类实例的唯一成员值,则可以将成员函数声明为静态。
static void flashDigit();
Cline 的 C++ FAQ 第 33.1-33.3 节对此进行了更详细的描述