Мне нужно иметь возможность контролировать два вывода 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 ().Несмотря на то, что во время цикла кнопка не нажимается, сценарий по-прежнему выводит, что было запущено прерывание.