Я пытаюсь обнаружить, когда штырь gpio идет от низкого к высокому, и у меня проблемы. Из того, что я прочитал, я должен быть в состоянии настроить булавку в качестве входных данных таким образом:beaglebone черный gpio select не работает
# echo in > /sys/class/gpio/gpio51/direction
# echo rising > /sys/class/gpio/gpio51/edge
Далее я пытаюсь запустить программы, которую программу ожидает нарастающий фронт с помощью выбора. Код выглядит следующим образом (обратите внимание, я закомментирована попытку просто прочитать файл, так как чтение предполагается блокировать, если не установлен O_NONBLOCK):
#include<stdio.h>
#include<fcntl.h>
#include <sys/select.h>
int main(void) {
int fd = open("/sys/class/gpio/gpio51/value", O_RDONLY & ~O_NONBLOCK);
//int fd = open("/sys/class/gpio/gpio51/value", O_RDONLY | O_NONBLOCK);
//unsigned char buf[2];
//int x = read(fd, &buf, 2);
//printf("%d %d: %s\n", fd, x, buf);
fd_set exceptfds;
int res;
FD_ZERO(&exceptfds);
FD_SET(fd, &exceptfds);
//printf("waiting for %d: %s\n", exceptfds);
res = select(fd+1,
NULL, // readfds - not needed
NULL, // writefds - not needed
&exceptfds,
NULL); // timeout (never)
if (res > 0 && FD_ISSET(fd, &exceptfds)) {
printf("finished\n");
}
return 0;
}
программа не выходит сразу, независимо от того, в каком состоянии штифт (высокий или низкий). Может ли кто-нибудь увидеть что-то не так с тем, как я это делаю?
PS. У меня есть библиотека python, которая использует poll(), чтобы сделать именно это, и python работает так, как ожидалось. Я вытаскиваю штырь низко, вызываю python, он блокирует, тянет пинкер высоко и код продолжается. Поэтому я не думаю, что это проблема с драйвером linux gpio.
Интересно, возможно ли это как-нибудь с помощью инструментов командной строки, таких как cat, tail, head, dd ... с некоторыми конкретными параметрами –