我正在忙于自定义电机控制器的固件。 为了进行原型设计,我使用带有mbed操作系统的核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);
}
}
答案 0 :(得分:1)
您要传递回调。试试这个:can1.attach(callback(this, &CANimp::rcv), CAN::RxIrq);
您可以在此处找到Mbed API和示例:https://os.mbed.com/docs/mbed-os/v5.9/reference/callback.html
答案 1 :(得分:0)
您正在尝试在以下方法上使用地址/引用运算符(&
):
can1.attach(&rcv, CAN::RxIrq);
函数可以使用其地址或分配给指针,但不能表示实际代表对象和函数的方法。您可以声明一个知道对象在哪里的独立函数,如下所示:
void example() {
CANimp::rcv()
}
然后改为传递example
,因为它是一个函数并且可以获取地址。您也可以根据库接受函数指针的方式使用C ++ lambda:
can1.attach([](){
CANimp::recv();
}, CAN::RxIrq);