比如我想监听PA7上的电平变化(也就是边沿触发),那么应该先向“/sys/class/gpio/gpio7/direction”写入“in”,然后向“/sys/class/gpio/gpio7/edge”写入“both”,然后对”/sys/class/gpio/gpio7/value”执行select/poll操作。
代码如下:
poll_test.c
#include <stdio.h> #include <fcntl.h> #include <poll.h> #include <unistd.h> int main() { int fd=open("/sys/class/gpio/gpio7/value",O_RDONLY); if(fd<0) { perror("open '/sys/class/gpio/gpio7/value' failed!\n"); return -1; } struct pollfd fds[1]; fds[0].fd=fd; fds[0].events=POLLPRI; while(1) { if(poll(fds,1,0)==-1) { perror("poll failed!\n"); return -1; } if(fds[0].revents&POLLPRI) { if(lseek(fd,0,SEEK_SET)==-1) { perror("lseek failed!\n"); return -1; } char buffer[16]; int len; if((len=read(fd,buffer,sizeof(buffer)))==-1) { perror("read failed!\n"); return -1; } buffer[len]=0; printf("%s",buffer); } } return 0; }
这个小程序的作用就是就是不断poll(“/sys/class/gpio/gpio7/value”)。一旦poll()返回,就输出PA7的值。
假设代码放在~目录下,然后输入如下命令:
cd ~ gcc poll_test.c -o poll_test echo in > /sys/class/gpio/gpio7/direction echo both > /sys/class/gpio/gpio7/edge ./poll_test
用1K电阻把PA7上拉到VCC,然后用一根导线把PA7与GND连接又断开,会发现不断输出1和0(当PA7连上GND的瞬间输出0,与GND断开的瞬间输出1)。说明poll()确实能检测到电平变化。