主页>技术社区>编程问答

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

eIT.com.cn 2023/3/15 9:21:27 阅读 3 次

打印


如何解决从其他类成员函数arduino调用的类成员函数?

我正在开发与nema stepper motor接口的arduino驱动程序。我创建了课程。我将其命名为Axis。我想为此类为每个电动机创建轴对象。但是,我无法从类中attachInterrupt中的arduino.h。它返回此:

In member function 'void Axis::setReverseInt()':
patep.cpp:12:77: error: invalid use of non-static member function 'void Axis::revDirection()'  attachInterrupt(digitalPinToInterrupt(reverseDirPin),revDirection,RISING);
Axis::Axis()
{

}
Axis::~Axis()
{

}

void  Axis::setReverseInt () { attachInterrupt(digitalPinToInterrupt(reverseDirPin),RISING);
}
void  Axis::setStopInt () { //attachInterrupt(digitalPinToInterrupt(stopPin),stopMotor,RISING);
}
void Axis::revDirection()
{ dirMode = !dirMode;
}
void Axis::stopMotor()
{ moveMotor = !moveMotor;
}
void Axis::startMotor()
{ moveMotor = true;
}
void Axis::moveStep(int Rev,byte laps,boolean dir)
{ digitalWrite(dirPin,dir); int total = Rev * laps; for (int i = 0; i < total; i++) {   speedValue = map((analogRead(speedPin)),1023,2000,10);   digitalWrite(Pin,HIGH);   delayMicroseconds(speedValue);   digitalWrite(Pin,LOW);   delayMicroseconds(speedValue); }
}

解决方法

在为自己正在从事的一个大型项目编写自己的库时,我遇到了类似的问题。在方法内部配置中断时发生在我身上。我发现了一种解决方法,尽管它看起来似乎有些复杂,但却可以解决问题。就我而言,我用它来读取旋转编码器的开关。

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

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

void init();

static void ISRHandler();

void setupISRHandler(uint8_t pin,void (*ISR)(void),int state); // this will configure your ISR

和一个指针:

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);

}

ISRHandler负责调用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);

}

我希望我的复杂解决方案对您有帮助

欢呼

博士丹尼尔






相关内容


热门栏目


特别声明


最新资讯
热讯排行



合作媒体友情链接
生活常识小贴士 软件开发教程 智慧城市生活网 息县通生活服务[移动版] 息县商圈[移动版] 美食菜谱
健康养生 法律知识 科技频道 电影影讯 留学考研学习 星座生肖|解梦说梦




关于我们 | 联系我们 | 合作媒体 | 使用条款 | 隐私权声明 | 版权声明

      Copyright © 2023 eIT.com.cn. All Rights Reserved. 豫ICP备2022012332号