Function 从其他类成员函数(arduino)调用的类成员函数

Function 从其他类成员函数(arduino)调用的类成员函数,function,class,arduino,static,member,Function,Class,Arduino,Static,Member,我正在开发与arduino接口的nema步进电机驱动器。我创建了一个类。我把它命名为Axis。我想用这个类为每个电机创建一个axis对象。但是,我不能从类中调用arduino.h中的attachintrupt函数。它返回以下错误: In member function 'void Axis::setReverseInt()': parsstep.cpp:12:77: error: invalid use of non-static member function 'void Axis::revD

我正在开发与arduino接口的nema步进电机驱动器。我创建了一个类。我把它命名为Axis。我想用这个类为每个电机创建一个axis对象。但是,我不能从类中调用
arduino.h
中的
attachintrupt
函数。它返回以下错误:

In member function 'void Axis::setReverseInt()':
parsstep.cpp:12:77: error: invalid use of non-static member function 'void Axis::revDirection()'
   attachInterrupt(digitalPinToInterrupt(reverseDirPin), revDirection, RISING);
轴::轴() { } 轴::~Axis() { } 无效轴::setReverseInt(){ 连接中断(数字插针中断(反向插针)、旋转方向、上升); } void轴::setStopInt(){ //连接中断(数字插针中断(停止)、停止电机、上升); } void Axis::revDirection() { dirMode=!dirMode; } 无效轴::停止电机() { moveMotor=!moveMotor; } void轴::startMotor() { moveMotor=true; } void Axis::moveStep(int pulseRev、字节重叠、布尔dir) { 数字写入(dirPin,dir); int totalPulse=脉冲数*圈数; 对于(int i=0;i我在为一个大项目编写自己的库时遇到了类似的问题。这发生在我在方法内部配置中断时。我找到了一个解决方法,虽然它看起来有点复杂,但它确实起到了作用。在我的例子中,我用它来读取旋转编码器及其开关

我使用的是指向ISR处理程序的指针和调用它的方法。在设置功能中,您可以调用ISR服务的初始化

首先,在.h文件中声明以下方法(除了您自己的方法外):

和一个指针:

static Axis *_ISRPointer; // can be declared as private (like in here from the '_' prefix)
然后,在.cpp文件中,您可以这样使用它:

#include "Axis.h"

Axis *Axis::_ISRPointer = nullptr;
您将在安装过程中使用init方法初始化ISR处理程序:

void Axis::init(){

    setupISRHandler(reverseDirPin, Axis::ISRHandler, RISING);

}
安装方法如下所示:

void Axis::setupISRHandler(uint8_t pin, void (*ISRFunction)(void), int state){

    attachInterrupt(digitalPinToInterrupt(pin), ISRFunction, state);

}
ISR处理程序负责调用ISR例程:

void Axis::ISRHandler(){

    _ISRPointer-> revDirection();

}

void Axis::revDirection(void){

    // Do not forget to disable interrupts
    cli();

    // your routine goes here
    dirMode= !dirMode;

    sei();
}
因此,您将在主.ino文件中执行以下操作:

#include "Axis.h"
#include <whateverotherlibraryyouneed.h>

Axis ax = Axis(); // your new object    

void setup(){

    ax.init();
    ax.startMotor();

}

void loop(){

    if(day == SUNNY){
        ax.moveStep(100, 2 , CLOCKWISE);
    } else {
        ax.stopMotor();
    }

    ax.someOtherMethodToControlTheMotor(anyArgumentYouWant);

}
#包括“Axis.h”
#包括
轴ax=轴();//您的新对象
无效设置(){
ax.init();
ax.startMotor();
}
void循环(){
如果(天=晴天){
最大移动步进(100,2,顺时针);
}否则{
ax.停止电机();
}
ax.其他控制变压器的方法(任意参数);
}
我希望我复杂的解决方案能有所帮助

干杯

丹尼尔博士

void Axis::ISRHandler(){

    _ISRPointer-> revDirection();

}

void Axis::revDirection(void){

    // Do not forget to disable interrupts
    cli();

    // your routine goes here
    dirMode= !dirMode;

    sei();
}
#include "Axis.h"
#include <whateverotherlibraryyouneed.h>

Axis ax = Axis(); // your new object    

void setup(){

    ax.init();
    ax.startMotor();

}

void loop(){

    if(day == SUNNY){
        ax.moveStep(100, 2 , CLOCKWISE);
    } else {
        ax.stopMotor();
    }

    ax.someOtherMethodToControlTheMotor(anyArgumentYouWant);

}