1

因此,我在这里有一个 c++ 程序,它利用wiringPi 使线程休眠,直到按下按钮(在使用GPIO 的rapsberryPi 上),但是当按下按钮时,它通常可以多次打印消息。我试图通过在循环中休眠几秒钟来解决这个问题,但这并没有帮助我相信它与中断生成如何调用函数有关。关于如何解决这个问题的任何建议,以便每次按下按钮时该功能只运行一次?

#include <stdlib.h>
#include <iostream>
#include <wiringPi.h>
#include <unistd.h>

void printMessage(void) { 
    std::cout << "Button pressed! hooray" << std::endl; 
}

int main(int argc, char const *argv[]) {   

    wiringPiSetup();

    while(true) {
        wiringPiISR(3, INT_EDGE_FALLING, &printMessage);//3 is the wiringPi pin #
        sleep(3);
    }

}
4

2 回答 2

2

我认为您只需设置一次 ISR(调用wiringPiISR一次)。之后就永远睡觉(while(1)sleep(10);)。您似乎已经使用 print 语句消除了按钮的抖动。去抖动通常是时间问题,打印需要几微秒,导致按钮“有点”去抖动。然而,它仍然可以做一些弹跳

有关更多去抖信息,请参阅此 SO 页面

于 2018-09-07T12:32:09.457 回答
1

我不熟悉 Raspberry-Pi,但如果代码可以直接感知按钮状态(而不是使用触发的中断),请执行以下操作以仅对启用转换做出反应:

int main (...)
{
     writingPiSetup ();
     bool  last_state = false;

     while (true)
     {
          bool this_state = wiringPiDigital (3);  // use correct function name
          if (last_state == false  &&  this_state == true) // button freshly pressed
          {
               std::cout << "Button freshly pressed" << std::endl;
          } 
          last_state = this_state;
     }
}

但是,硬件很可能没有去抖动。所以可能需要插入一点延迟。根据应用程序的具体情况,我会尝试 10 到 100 毫秒范围内的延迟。

于 2018-09-07T05:45:50.040 回答