Ошибка соответствия функции при использовании attachInterrupt - PullRequest
5 голосов
/ 27 января 2012

У меня небольшая ошибка с моим последним кодом проекта Arduino, который использует библиотеку TimerOne для отображения чисел на 4-значном 7-сегментном дисплее. Я использую прерывание, чтобы микропроцессор постоянно переключался между каждой цифрой, поскольку они по существу связаны друг с другом.

У меня отлично работает код, если я храню все это в основном файле PDE, но я подумал, что было бы лучше изолировать дисплей в своем собственном классе.

Мой компилятор испытывает проблемы со второй строкой следующего кода в PDE:

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

Второй аргумент в attachInterrupt должен быть необязательным, Я пробовал с и без этого! В любом случае я получаю следующую ошибку:

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 () нет ничего плохого - он, безусловно, работал, прежде чем поместить его в свой собственный класс.

Очевидно, что я могу обойти эту ошибку, добавив

void Interrupt()
{
   digitDisplay.flashDigit();
}

к основному PDE и присоединению этой функции, но это всего лишь обходной путь, было бы неплохо, если бы я мог вызвать его напрямую.

Я вижу, что ошибка связана с созданием указателя на функцию (которого нет, следовательно, и ошибка), но указатели не являются моей сильной стороной, поэтому я действительно мог бы сделать это с помощью ручной сортировки.

Ответы [ 2 ]

3 голосов
/ 27 января 2012

Вы очень близки.Проблема в том, что функция-член (flashDigit ()) - это не то же самое, что функция (void function ()).Функция-член относится к функции, которая может измениться во время выполнения, в отличие от функции, известной во время компиляции.(отсюда ошибка msg о неразрешенном типе функции).Есть два «обходных пути».Первая функция конверта, которую вы указали.И, во-вторых, если функция не нуждается в использовании уникальных значений членов экземпляра класса, функция-член может быть объявлена ​​статической.

static void flashDigit();

Это описано более подробно в разделе 33.1-33.3 часто задаваемых вопросов Cline C ++

1 голос
/ 08 февраля 2013

У меня была такая же проблема с библиотекой Arduino TWI и указанием функции обратного вызова.поэтому я создал статическую функцию-обертку, которая вызывает объекты класса.

В моем файле .h у меня есть:

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

и в моем файле .cpp:*

Теперь я вызываю функцию-оболочку

Подробности и полное объяснение здесь: http://www.newty.de/fpt/callback.html#static

...