首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GPIO值更改时通知

GPIO值更改时通知
EN

Stack Overflow用户
提问于 2017-07-18 23:37:18
回答 3查看 1.9K关注 0票数 3

我目前正在尝试仅使用shell脚本来轮询GPIO值。

在使用/sys/class/gpio/gpioxx/value之前,我基本上用一个测试文件开发了这个脚本

这是我找到的解决方案:

代码语言:javascript
运行
复制
#!/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,则不会触发任何事件。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-01-14 21:51:13

来自linux/Documentation/gpio/gpio-legacy.txt

代码语言:javascript
运行
复制
"/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.

所以你可以这样做:

代码语言:javascript
运行
复制
echo input > /sys/class/gpio/gpioN/direction
echo both > /sys/class/gpio/gpioN/edge

现在,您必须找到一个在/sys/class/gpio/gpioN/value上调用poll (或pselect)的命令。(如果我找到答案,我会更新我的答案)

票数 2
EN

Stack Overflow用户

发布于 2018-01-14 21:18:41

这是一个紧凑的循环解决方案(它更耗费资源),但如果没有更好的解决方案,它将会起到作用:

代码语言:javascript
运行
复制
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

输出示例:

代码语言:javascript
运行
复制
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

我将其用于调试目的。

实际上,我通常更多地使用这一行:

代码语言:javascript
运行
复制
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

同样,出于调试目的。

票数 0
EN

Stack Overflow用户

发布于 2018-01-14 21:57:22

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45171372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档