我目前正在尝试仅使用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-在保存文件时触发"modify“事件,而不是在文件内容发生更改时触发。因此,如果我在文件中写入相同的值,该事件将被触发,但它不应该被触发。
2-我重选了这个解决方案不适用于gpio,如果我使用一个简单的ascii文件,它可以工作,但当我在/sys/class/gpio/gpioxx/value上使用inotifywait时,这取决于它。
如果我使用echo value >/sys/class/gpioxx/value,则会检测到事件,但如果我将引脚配置为输入并将其连接到3v3或0V,则不会触发任何事件。
有人知道我是如何仅使用脚本触发此更改的吗?
发布于 2018-01-14 21:51:13
来自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现在,您必须找到一个在/sys/class/gpio/gpioN/value上调用poll (或pselect)的命令。(如果我找到答案,我会更新我的答案)
发布于 2018-01-14 21:18:41
这是一个紧凑的循环解决方案(它更耗费资源),但如果没有更好的解决方案,它将会起到作用:
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同样,出于调试目的。
发布于 2018-01-14 21:57:22
您可以使用libgpiod,它提供了一些有用的工具来监视GPIO。但是,您需要使用Linux 4.8提供的新GPIO API。
https://stackoverflow.com/questions/45171372
复制相似问题