gpt4 book ai didi

c++ - 计时器无法与 wiringPiISR(QtQuick 应用程序)一起使用

转载 作者:行者123 更新时间:2023-12-04 03:30:44 29 4
gpt4 key购买 nike

我创建了一个类 Capteur_Input并且构造函数中的一个选项使用 wiringPiISR 创建中断

wiringPiISR(m_pin, INT_EDGE_RISING, isrInput);

我的类(class)也有一个属性m_impulsion每次发生中断时我都会增加这个值。

这是我的中断处理程序的样子

void Capteur_Input::isrCallback()
{
if(m_pin== Pin_vitesse)
{
increment_impulsion();
emit digital_inputChanged(m_impulsion);
}
else
emit digital_inputChanged(m_value);
}

在我的 main.cpp我创建了这个类的一个实例

static void isrInput_vitesse();

static Capteur_Input vitesse(Pin_vitesse,PUD_OFF,INT_EDGE_RISING,isrInput_vitesse);

static void isrInput_vitesse()
{
vitesse.isrCallback();
}

一切正常,qml 和 C++ 部分。

现在我想计算每秒检测到的脉冲数。但我做不到。

我的类(class) Capteur_Input还有一个定时器,我在构造函数里配置了

m_timer =new QTimer (this);
m_timer->setTimerType(Qt::PreciseTimer);
connect (m_timer,SIGNAL(timeout()),this,SLOT(onTimeout()));
m_timer->start(500);

我尝试在 SLOT onTimeout() 中进行测试,但这 qDebug()<<"VITESSEEEEEEEE"<<m_pin <<readPin()<<vitesse;永远不会出现。我不知道为什么可能是因为 wiringPiISR 是一个线程并且比定时器具有更高的优先级?有人可以向我解释一下,如何制作一个计算准确时间并同时使中断工作的计时器吗?计时器正在为此类的其他实例工作,这些实例只是输入没有中断

void Capteur_Input::onTimeout()
{
qDebug()<<"time is up"<<m_pin;

if(m_pin== Pin_vitesse)
{
qDebug()<<"m_pin== Pin_vitesse";
int vitesse;

vitesse= int (calcul_vitesse/4*2.166);//*0.001/3600;
qDebug()<<"VITESSEEEEEEEE"<<m_pin <<readPin()<<vitesse;

emit vitesse_Changed(vitesse);
qDebug()<<"VITESSEEEEEEEE"<<m_pin <<readPin()<<vitesse;


}
else{

emit digital_inputChanged(readPin());
qDebug()<<"signal DIGITAL emitted m_pin"<<m_pin <<"value"<<readPin();
}
}

实际上插槽 onTimeout 正在为这两个实例工作

#define Pin_vitesse 3
#define PinFrein 0
#define PinClignotnat_G 2

Capteur_Input frein(PinFrein,PUD_UP,NO_INTERRUPT);
Capteur_Input clignotant_G(PinClignotnat_G,PUD_DOWN,NO_INTERRUPT);

并且不适用于这个中断 static Capteur_Input vitesse(Pin_vitesse,PUD_OFF,INT_EDGE_RISING,isrInput_vitesse);

这是我得到的输出

time is up 0
signal DIGITAL emitted 0 1
time is up 2
signal DIGITAL emitted 2 0

time is up 0
signal DIGITAL emitted 0 1

计时器对其他实例有效,而对中断实例无效

最佳答案

Qt 不支持静态 QObject 实例,如下所述(QObject 重入 section ):

In general, creating QObjects before the QApplication is not supportedand can lead to weird crashes on exit, depending on the platform. Thismeans static instances of QObject are also not supported. A properlystructured single or multi-threaded application should make theQApplication be the first created, and last destroyed QObject.

如果在 isr 中断出现时需要回调,静态指针应该可以工作:

static void isrInput_vitesse();

static Capteur_Input *vitesse = nullptr;

static void isrInput_vitesse()
{
if(!vitesse) //not initialized yet
return;

QMetaObject::invokeMethod( vitesse, "isrCallback", Qt::QueuedConnection ); //or blockingQueue if you need to handle it directly in Qt way.
}

vitesse 指针应在 QApplication 实例初始化后在 main() 中初始化。

 int main(int argc, char *argv[])
{
QApplication a(argc, argv);

//..... your main application body

vitesse = new Capteur_Input(Pin_vitesse,PUD_OFF,INT_EDGE_RISING,isrInput_vitesse);

//...
}

关于c++ - 计时器无法与 wiringPiISR(QtQuick 应用程序)一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66869600/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com