проблема в создании класса
- Войдите на сайт для отправки комментариев
Вс, 09/08/2015 - 20:56
Хочу создать клас RFID ридера. Не могу назначить функцию прерывания для элемента класса (функция PCattachInterrupt).
Идея: При обявлении класса нужно зарегестрировать ф-ции прерывания для вывода D0 и D1. Теоретически программа должна для каждого экземпляра класа создать свои две ф-ции прерывания, потому this должен указать на конкретный экземпляр и соответственно на конкретную ф-цию, но не работает.
Гуру С++ помогите решыть проблему!
Ошибка:
error: reference to non-static member function must be called; did you mean to call it with no arguments? PCattachInterrupt(_D1_pin, this->readerOne, CHANGE); ~~~~~~^~~~~~~~~ libraries/PinChangeInt/PinChangeInt.h:163:78: note: expanded from macro 'PCattachInterrupt' #define PCattachInterrupt(pin,userFunc,mode) PCintPort::attachInterrupt(pin, userFunc,mode) ^ rdrRFID.cpp:37:29: error: cannot initialize a parameter of type 'PCIntvoidFuncPtr' (aka 'void (*)()') with an rvalue of type 'void' PCattachInterrupt(_D1_pin, this->readerOne, CHANGE); ^~~~~~~~~~~~~~~
КОД:
/*
ReaderRFID.cpp - библиотека для ридера с интерфейсом WIEGAND 26 Версия 1.0 */ #include "rdrRFID.h" #include <PinChangeInt.h> rdrRFID::rdrRFID(int _D0, int _D1) { _D0_pin = _D0; _D1_pin = _D1; reader = 0; _readerCount = 0; } void rdrRFID::readerOne(void) { if(digitalRead(_D1_pin) == LOW){ _readerCount++; reader = reader << 1; reader |= 1; } } void rdrRFID::readerZero(void) { if(digitalRead(_D0_pin) == LOW){ _readerCount++; reader = reader << 1; } } void rdrRFID::initReader(void){ //инициализация //установка прерывания на портах контроллера PCattachInterrupt(_D1_pin, this->readerOne, CHANGE); PCattachInterrupt(_D0_pin, this->readerZero, CHANGE); //установка направления порта int arr_pin_reader[2]={_D0_pin, _D1_pin}; for(int i = 0; i < 2; i++) { pinMode(arr_pin_reader[i], OUTPUT); digitalWrite(arr_pin_reader[i], HIGH); digitalWrite(arr_pin_reader[i], LOW); pinMode(arr_pin_reader[i], INPUT); digitalWrite(arr_pin_reader[i], HIGH); } }
Вроде бы все прозрачно, пишет, что функцию член класса нельзя назначить на прерывание, только статическую функцию. Это правильно со всех точек зрения.
Такова себя ви, что поделаешь
<Тыдыщ!>
и на том спасибо, будем искать решение...
об результатах отпишусь!
Так сделайте её статической, а this храните отдельно в каком-нибудь управляющем блоке), а обработчик прерывания его оттуда вытащит и вызовет метод.
да, но откуда обработчик прерывания будет знать какой элемент класса и соответственно его переменные использовать?
Из управляющего блока - это может быть одна переменная в которой адрес экземрляра сидит или структура, если надо больше данных.
все пошло, правда пока не проверял на рабочей железке, но компилятор ошибки не дает
сделал как здесь:
http://forum.arduino.cc/index.php?topic=41713.0
Можно и так. Здесь существенную роль играет тот факт, что переменная foo описана выше функции обработчика fooBar()