【发布时间】:2021-03-30 10:51:13
【问题描述】:
我创建了一个类Capteur_Input,构造函数中的一个选项使用wiringPiISR创建了一个中断
wiringPiISR(m_pin, INT_EDGE_RISING, isrInput);
我的班级还有一个属性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++ 部分。
现在我想计算每秒检测到的脉冲数。但我做不到。
我的班级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 插槽适用于这 2 个实例
#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
计时器正在为其他实例工作,但它不适用于作为中断的实例
【问题讨论】:
-
这可能是您在
emit vitesse_Changed(vitesse)上有一个循环,因为如果信号连接到的插槽是DirectConnection,它将运行。因此,如果您在看到它出现之前将 qDebug 调用移至该行 -
我移动了它,但它没有出现:/
-
似乎处理定时器事件的事件循环不起作用(主事件循环)。你有类似 app.exec() 的东西吗? Capteur_Input 是基于类定义中的 Q_OBJECT 宏的 QObject?
-
我编辑了我的帖子,计时器适用于此类的其他实例,并且 Capteur_Input 类继承自 Capteur_ 类,Capteur_ 是一个 QObject 类并包含宏 Q_OBJECT
标签: c++ qt qt5 qtimer wiringpi