Итак, у меня есть программа на С ++, использующая 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);
}
}
Я думаю, что вы должны установить ISR только один раз (позвоните wiringPiISR
один раз). После этого просто спать вечно (while(1)sleep(10);
). Вы, кажется, отклонили вашу кнопку, используя оператор печати. Часто отмена отклика может быть связана с выбором времени, и печать занимает несколько микросекунд, в результате чего кнопка становится «некой». Тем не менее, он все еще может делать некоторые подпрыгивая
Я не знаком с 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 миллисекунд в зависимости от особенностей приложения.