Событие Link в классе C ++ - PullRequest
0 голосов
/ 10 марта 2019

Я занят прошивкой кастомного моторконтроллера.Для прототипирования я использую ядро ​​L432 с ОС mbed.

Связь с главным контроллером организована по шине CAN.Я получил бы процедуру прерывания, когда есть полученные данныеЭтот код работает очень хорошо, когда помещается в основной файл, но я хотел бы реализовать этот код в отдельном классе.Но когда я пытаюсь скомпилировать это решение, я продолжаю получать следующую ошибку от компилятора: Ошибка: Нестандартная форма для получения адреса функции-члена в "Lib / CANimp.cpp", строка: 19, столбец: 18

У кого-нибудь есть решение для этого?

**CANimp.h**

#define CANIMP_H

#include "mbed.h"

class CANimp {

    public:
        CANimp(PinName can_rd, PinName can_td);

        void send(void);    

    private:
        CAN can1;
        void rcv(void);
};


#endif

**CANimp.cpp**
#include "CANimp.h"
#include "mbed.h"

void CANimp::rcv() {
    CANMessage msg1;
    can1.read(msg1);
    if(msg1.data[0] == 1)
    {
         float speed = msg1.data[1] / 255.0;
         printf("set speed to %f \n", speed);
         //Motordriver.setPWM(speed);
    }
    printf("Message received: %d  %d\n\n", msg1.data[0], msg1.data[1]);
}

CANimp::CANimp(PinName can_rd, PinName can_td) : can1(can_rd, can_td)
{
    can1.frequency(250000);
    can1.attach(&rcv, CAN::RxIrq);
}

void CANimp::send() {
    pc.printf("send()\n");
    char temp[8];
    temp[0] = 1;
    temp[1] = 255;
    temp[2] = 50;
    if (can1.write(CANMessage(1338, temp, 3))) {
        //pc.printf("wloop()\n");
        //pc.printf("Message sent: %d\n", counter);
        wait(0.02);
    } 
}

Ответы [ 2 ]

1 голос
/ 10 марта 2019

Вы хотите пройти обратный вызов.Попробуйте это: can1.attach(callback(this, &CANimp::rcv), CAN::RxIrq);

Вы можете найти Mbed API и примеры здесь: https://os.mbed.com/docs/mbed-os/v5.9/reference/callback.html

0 голосов
/ 10 марта 2019

Вы пытаетесь использовать оператор адреса / ссылки (&) для метода:

can1.attach(&rcv, CAN::RxIrq);

Функциям можно присвоить их адрес или назначить указатели, но не методы , которые фактически представляют объект и функцию. Вы можете объявить отдельную функцию, которая знает, где находится объект, например:

void example() {
    CANimp::rcv()
}

Затем передайте example вместо этого, поскольку это функция, и ее адрес может быть взят. Вы также можете использовать лямбда-выражения C ++ в зависимости от того, как библиотека принимает указатели функций:

can1.attach([](){
  CANimp::recv();
}, CAN::RxIrq);
...