Несколько вызовов функций при нажатии одной кнопки, генерирующей прерывания

Итак, у меня есть программа на С ++, использующая wiringPi для ожидания потока до нажатия кнопки (на rapsberryPi с использованием GPIO), но когда кнопка нажата, она часто может напечатать сообщение несколько раз. Я попытался исправить это, поспав несколько секунд в цикле, но это не помогло мне поверить, что это как-то связано с тем, как генерация прерываний вызывает функцию. Любой совет, как я могу решить эту проблему, чтобы функция запускалась только один раз за нажатие кнопки?

#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);
}

}

1

Решение

Я думаю, что вы должны установить ISR только один раз (позвоните wiringPiISR один раз). После этого просто спать вечно (while(1)sleep(10);). Вы, кажется, отклонили вашу кнопку, используя оператор печати. Часто отмена отклика может быть связана с выбором времени, и печать занимает несколько микросекунд, в результате чего кнопка становится «некой». Тем не менее, он все еще может делать некоторые подпрыгивая

Для получения дополнительной информации см. Эту страницу SO

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;
}
}

Тем не менее, вполне возможно, что оборудование не подавлением дребезга контактов. Таким образом, можно добавить немного задержки. Я бы поэкспериментировал с задержками в диапазоне от 10 до 100 миллисекунд в зависимости от особенностей приложения.

1

По вопросам рекламы [email protected]