我的最新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并附加该功能,但这只是一个解决方法,如果我可以直接调用它会很好。
我看到错误与制作一个函数指针(其中一个不存在因此错误)有关,但是指针不是我的强点所以我真的可以用手对它进行排序。
答案 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);
}
现在我调用包装函数