2012-01-27 26 views
5

Tôi gặp lỗi nhỏ với mã dự án Arduino mới nhất sử dụng TimerOne library để hiển thị số trên màn hình 4 chữ số, 7 đoạn. Tôi sử dụng một ngắt để làm cho bộ vi xử lý liên tục flick giữa mỗi chữ số khi chúng về cơ bản có dây với nhau.Không có lỗi chức năng phù hợp khi sử dụng attachInterrupt

Tôi có mã hoạt động hoàn hảo nếu tôi giữ nguyên tất cả trong tệp PDE chính, nhưng tôi nghĩ sẽ tốt hơn nếu cô lập màn hình trong lớp riêng của nó.

trình biên dịch của tôi đang gặp rắc rối với dòng thứ hai của đoạn mã sau trong PDE:

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

Các arg thứ hai trong attachInterrupt nên không bắt buộc, Tôi đã cố gắng có và không có này! Nhưng dù sao tôi nhận được thông báo lỗi sau:

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) 

Trong DigitDisplay (trong đó digitDisplay là một ví dụ), tôi xác định flashDigit như sau:

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; 
} 

Nếu bạn yêu cầu mã hơn xin vui lòng cho tôi biết nhưng tôi khá chắc chắn không có gì sai với các gubbings của phương thức flashDigit() - nó chắc chắn đã làm việc trước khi tôi đặt nó bên trong lớp riêng của nó.

Rõ ràng tôi có thể phá vỡ được lỗi này bằng cách thêm

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

để PDE chính và gắn chức năng đó, nhưng đó chỉ là một công việc xung quanh, nó sẽ được tốt đẹp nếu tôi có thể gọi nó là trực tiếp.

Tôi thấy lỗi là phải thực hiện với việc tạo con trỏ hàm (trong đó không tồn tại do đó lỗi), nhưng con trỏ không phải là điểm mạnh của tôi vì vậy tôi có thể thực sự làm với một bàn tay sắp xếp này.

+0

ví dụ thứ hai của bạn sử dụng 'digitDisplay.flashDigit() 'là khác nhau hơn' digitDisplay .flashDigit'. Bạn đã thử cái này chưa? – gary

+0

Có, tôi đã làm, nó không giải quyết được vấn đề, nhưng dù sao đi nữa;) – SmallJoeMan

Trả lời

3

Bạn đang ở rất gần. Vấn đề là một hàm thành viên (flashDigit()) không giống với hàm (hàm void()). Hàm thành viên là ptr đến một hàm có thể thay đổi khi chạy, không giống như hàm được biết lúc biên dịch. (do đó thông báo lỗi về loại hàm chưa được giải quyết). Có hai "xung quanh công việc". Hàm phong bì đầu tiên mà bạn chỉ ra. Và thứ hai, nếu hàm không cần tận dụng các giá trị thành viên duy nhất của một cá thể của lớp, hàm thành viên có thể được khai báo là tĩnh.

static void flashDigit();

This is described in more detail in section 33.1-33.3 of the Cline's C++ FAQ

+0

Cảm ơn rất nhiều, điều đó rất hữu ích. – SmallJoeMan

1

Tôi có vấn đề này cùng với thư viện Arduino TWI và quy định cụ thể chức năng gọi lại. vì vậy tôi đã tạo ra một hàm bao bọc tĩnh gọi các đối tượng lớp.

Trong file .h của tôi, tôi có:

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

và trong tôi.tập tin cpp tôi có:

#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); 
} 

bây giờ tôi gọi hàm wrapper thay

Các chi tiết và đầy đủ giải thích ở đây: http://www.newty.de/fpt/callback.html#static

Các vấn đề liên quan