更改gpio值时通知

时间:2017-07-18 15:37:18

标签: linux shell gpio

我目前正在尝试仅使用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则不会触发任何事件。

有人知道如何仅使用脚本触发此更改吗?

3 个答案:

答案 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。