我目前正在尝试仅使用shell脚本来轮询gpio值。
在使用/ sys / class / gpio / gpioxx / value
之前,我基本上用测试文件开发了脚本这是我找到的解决方案:
#!/bin/bash
SCRIPT_DIR=$(dirname $(readlink -f $0))
FILE_NAME=$SCRIPT_DIR"/fileTest"
while true
do
inotifywait -qq -e modify $FILE_NAME
read val < $FILE_NAME
echo $val
### do something here ###
done
这是使用基本文件,但我对此解决方案有两个问题。
1 - &#34;修改&#34;保存文件时触发事件,而不是文件内容更改时触发事件。因此,如果我在文件中写入相同的值,则会触发事件,但不应该触发。
2 - 我再次说明这个解决方案对gpios不起作用,如果我使用简单的ascii文件它可以工作但是当我在/ sys / class / gpio / gpioxx / value上使用inotifywait时它取决于
如果我使用回音值&gt; / sys / class / gpio / gpioxx / value检测到事件,但是如果我将引脚配置为输入并将其连接到3v3或0V则不会触发任何事件。
有人知道如何仅使用脚本触发此更改吗?
答案 0 :(得分:0)
这是一个紧凑的循环解决方案(这是更加资源密集型的),但是如果你没有更好的东西,它会发挥作用:
gpio_value=$(cat /sys/class/gpio/gpio82/value)
while true; do
value=$(cat /sys/class/gpio/gpio82/value)
if [[ $gpio_value != $value ]]; then
gpio_value=$value
echo "$(date +'%T.%N') value changed to $gpio_value"
fi
done
示例输出:
13:09:52.527811324 value changed to 1
13:09:52.775153524 value changed to 0
13:09:55.439330380 value changed to 1
13:09:55.711569164 value changed to 0
13:09:56.211028463 value changed to 1
13:09:57.082968491 value changed to 0
我将它用于调试目的。
实际上,我通常会经常使用这种单行程序:
printf " Press any key to stop...\n GPIO value: " ; until $(read -r -t 0 -n 1 -s key); do printf "\033[2D$(cat /sys/class/gpio/gpio82/value) " ; done ; echo
再次,出于调试目的。
答案 1 :(得分:0)
来自linux/Documentation/gpio/gpio-legacy.txt
:
"/sys/class/gpio/gpioN/edge"
... reads as either "none", "rising", "falling", or
"both". Write these strings to select the signal edge(s)
that will make poll(2) on the "value" file return.
所以你可以这样做:
echo input > /sys/class/gpio/gpioN/direction
echo both > /sys/class/gpio/gpioN/edge
现在,您必须找到一个在poll
上调用pselect
(或/sys/class/gpio/gpioN/value
)的命令。 (如果找到答案我会更新我的答案)
答案 2 :(得分:0)
您可以使用libgpiod提供一些有用的工具来监控GPIO。但是,您需要使用Linux 4.8中提供的新GPIO API。