所以我在这里有一个c ++程序,它利用wireingPi来使线程休眠直到按钮被按下为止(在使用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);
}
}
答案 0 :(得分:2)
我认为您只需设置一次ISR(请致电wiringPiISR
)。在那之后,就永远睡(while(1)sleep(10);
)。您似乎已使用打印语句对按钮进行了防抖处理。防抖动通常可能是时间问题,打印需要花费几微秒的时间,从而使按钮被“防抖动”。但是它仍然可以弹跳
答案 1 :(得分: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;
}
}
但是,硬件很可能不是debounced。因此,可能需要插入一点延迟。我会根据应用程序的具体情况尝试10到100毫秒的延迟。