【问题标题】:Notify when gpio value is changed当 gpio 值改变时通知
【发布时间】:2017-12-23 14:13:25
【问题描述】:

我目前正在尝试仅使用 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 - 保存文件时触发“修改”事件,而不是文件内容更改时触发。因此,如果我在文件中写入相同的值,则会触发该事件,但它不应该。

2 - 我说这个解决方案不适用于 gpios,如果我使用简单的 ascii 文件,它可以工作,但是当我在 /sys/class/gpio/gpioxx/value 上使用 inotifywait 时,它取决于。

如果我使用 echo value > /sys/class/gpio/gpioxx/value 会检测到事件,但如果我将引脚配置为输入并将其连接到 3v3 或 0V,则不会触发任何事情。

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

【问题讨论】:

    标签: linux shell gpio


    【解决方案1】:

    来自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)的命令。 (如果我找到答案,我会更新我的答案)

    【讨论】:

    • OP 提到的inotifywait 对我有用(只要您设置优势)。 inotifywait -qme modify /sys/class/gpio/gpio42/value 2&gt;&amp;1 | while read line; do cat /sys/class/gpio/gpio42/value; done 理论上,如果在 systemd 系统上,您可以在 foo.path 单元中使用 PathModified= 来激活 foo.service
    【解决方案2】:

    这是一个紧密循环的解决方案(更耗费资源),但如果你没有更好的办法,那就可以了:

    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
    

    再次,出于调试目的。

    【讨论】:

      【解决方案3】:

      您可以使用libgpiod,它提供了一些有用的工具来监控 GPIO。但是,您需要使用 Linux 4.8 中提供的新 GPIO API。

      【讨论】:

        猜你喜欢
        • 2012-01-19
        • 2017-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-17
        • 2013-10-20
        • 2014-04-03
        • 1970-01-01
        相关资源
        最近更新 更多