Как опросить контакты Raspberry Pi GPIO с помощью select () в c ++ - PullRequest
0 голосов
/ 10 апреля 2019

Мне нужно иметь возможность контролировать два вывода GPIO на RaspberryPi 3B и получать сигнал от нажатия кнопки для них обоих, используя функцию select () в c ++.Я могу выполнить опрос одного контакта с помощью команды poll (), но не смог опросить даже один контакт с помощью команды select.

Я пытался установить & исключенияfds для отслеживания исключенийк файловым дескрипторам, выполненным POLLPRI с помощью poll (), но не увенчавшимся успехом.Это было сделано с использованием тех же файловых дескрипторов для «select ()», что и для «poll ()».

Я прочитал рекомендации для «select ()», но все еще борюсь: http://man7.org/linux/man-pages/man2/select.2.html

Я попробовал следующие советы из следующих: - https://www.youtube.com/watch?v=qyFwGyTYe-M

int gpio_poll(int gpio_fd, int gpio2_fd, int timeout)
{

//
  int rc;
  fd_set exceptfds;
  struct timeval timeoutX;
  FD_ZERO(&exceptfds);
  FD_SET(gpio_fd,&exceptfds);
  //FD_SET(gpio2_fd,&exceptfds);
  char buf[MAX_BUF];

  printf("gpio_fd is :::: %i\n ", gpio_fd); // == 3

  timeoutX.tv_sec = 2;
  timeoutX.tv_usec = 0;

  rc = select(4,NULL,NULL,&exceptfds,&timeoutX);

  printf("rc is:::: %i\n", rc);

НИЖЕ IS 'poll ()' ЭКВИВАЛЕНТНАЯ ПОПЫТКА //

  /*
  struct pollfd fdset[1];
  int nfds = 1;
  int rc;
  char buf[MAX_BUF];

  memset((void*)fdset, 0, sizeof(fdset));

  fdset[0].fd = gpio_fd;
  fdset[0].events = POLLPRI;

  rc = poll(fdset, nfds, timeout);

  printf("rc is:::: %i\n", rc);

  if (fdset[0].revents & POLLPRI) {
    // dummy read
    read(fdset[0].fd, buf, MAX_BUF);
  }
  */

Учитывая, что самый высокийчисло в файле-дескрипторе было 3, и nfds должно быть этим числом + 1, я поместил 4 в качестве первого аргумента функции select ().Несмотря на то, что во время цикла кнопка не нажимается, сценарий по-прежнему выводит, что было запущено прерывание.

...