Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c+中的链接事件+;班_C++_Mbed_Nucleo - Fatal编程技术网

C++ c+中的链接事件+;班

C++ c+中的链接事件+;班,c++,mbed,nucleo,C++,Mbed,Nucleo,我正忙于定制motorcontroller的固件。 对于protyping,我使用NucleoL432和mbed os 通过CAN总线组织与主控制器的通信。 当接收到数据时,我会有一个中断例程。 这段代码放在主文件中时效果很好,但我想在一个单独的类中实现这段代码。 但当我尝试编译此解决方案时,我不断收到来自编译器的以下错误: 错误:获取“Lib/CANimp.cpp”中成员函数地址的非标准格式,第19行,第18列 有人能解决这个问题吗 **CANimp.h** #define CANIMP_H

我正忙于定制motorcontroller的固件。 对于protyping,我使用NucleoL432和mbed os

通过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);
    } 
}

您正试图在方法上使用地址/引用运算符(
&
):

can1.attach(&rcv, CAN::RxIrq);
函数的地址可以是指针的地址,也可以是指针的地址,但不能是实际表示对象和函数的方法。您可以声明一个独立函数,该函数知道对象的位置,如下所示:

void example() {
    CANimp::rcv()
}
然后传递
示例
,因为它是一个函数,可以获取它的地址。还可以使用C++ LAMBDAS,这取决于库如何接受函数指针:

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

您要传递回调。试试这个:
can1.attach(回调(this,&CANimp::rcv),CAN::RxIrq)


您可以在这里找到Mbed API和示例:

方法不表示“和对象和函数”。它们是函数,具有隐式的第一个参数,该参数是指向调用它们的对象的指针,
this
指针。人们可以引用一种方法。尝试替换
can1.attach(&rcv,CAN::RxIrq)带有
can1.attach(&CANimp::rcv,CAN::RxIrq)。可能存在的重复项