Несколько вызовов функций при нажатии одной кнопки, генерирующей прерывания - PullRequest
0 голосов
/ 07 сентября 2018

Итак, у меня есть программа на С ++, использующая 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);
    }

}

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

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

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

0 голосов
/ 07 сентября 2018

Я не знаком с 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 миллисекунд в зависимости от особенностей приложения.

...