我正在尝试监视 GPIO 引脚,并且根据 Linux 文档,我应该能够通过使用以下命令监视/sys/class/gpio/gpio##/value
文件来做到这一点select
:
"value" ... reads as either 0 (low) or 1 (high). If the GPIO
is configured as an output, this value may be written;
any nonzero value is treated as high.
If the pin can be configured as interrupt-generating interrupt
and if it has been configured to generate interrupts (see the
description of "edge"), you can poll(2) on that file and
poll(2) will return whenever the interrupt was triggered. If
you use poll(2), set the events POLLPRI and POLLERR. If you
use select(2), set the file descriptor in exceptfds. After
poll(2) returns, either lseek(2) to the beginning of the sysfs
file and read the new value or close the file and re-open it
我正在尝试在 Ruby 中执行此操作,并且根据它调用的IO.Select 文档select(2)
。
因此,有了这些知识,我将以下测试程序放在一起:
fd = File.open("/sys/class/gpio/gpio17/value", "r")
loop do
rs,ws,es = IO.select(nil, nil, [fd], 5)
if es
r = es[0]
puts r.read(1)
else
puts "timeout"
end
end
但是,它不会检测到任何引脚更改。当我启动这个应用程序时,它会立即落入if
块中并显示引脚的当前值,然后每 5 秒打印一次timeout
。
我读错了文档吗?应该不能select
监控吧?