【问题标题】:Multiple function calls on one interrupt-generating button press按下一个产生中断的按钮即可调用多个函数
【发布时间】:2018-09-07 05:16:24
【问题描述】:

所以我在这里有一个 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);
    }

}

【问题讨论】:

  • 在按钮被按下和释放时打印消息来解决它。

标签: c++ raspberry-pi wiringpi


【解决方案1】:

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

For more debouncing info see this SO page

【讨论】:

  • 原来如此,我有点误解wiringPiISR的用法,非常感谢!
【解决方案2】:

我不熟悉 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;
     }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 2019-08-26
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多