【问题标题】:Link event in c++ classc++ 类中的链接事件
【发布时间】:2019-03-09 22:04:32
【问题描述】:

我正忙于定制电机控制器的固件。 对于原型设计,我使用带有 mbed 操作系统的 nucleo L432。

与主控制器的通信是通过 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);
    } 
}

【问题讨论】:

标签: c++ mbed nucleo


【解决方案1】:

你想传递一个回调。试试这个:can1.attach(callback(this, &CANimp::rcv), CAN::RxIrq);

您可以在此处找到 Mbed API 和示例:https://os.mbed.com/docs/mbed-os/v5.9/reference/callback.html

【讨论】:

    【解决方案2】:

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

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

    函数可以获取地址或分配给指针,但方法不能真正表示对象和函数。您可以声明一个知道对象在哪里的独立函数,如下所示:

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

    然后传递example,因为它是一个函数并且可以获取它的地址。您还可以根据库接受函数指针的方式使用 C++ lambda:

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

    【讨论】:

    • 方法不代表“和对象和函数”。它们是函数,具有隐含的第一个参数,即指向它们调用的对象的指针,即this 指针。可以参考一种方法。 Example here.
    猜你喜欢
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 2022-01-16
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 2011-01-02
    相关资源
    最近更新 更多