2017-07-18 111 views
3

我目前正在嘗試只用shell腳本來輪詢gpio值。gpio值更改時通知

我基本上developped與測試文件中的腳本使用/ SYS /班/ GPIO/gpioxx /值

之前,這是我找到了解決方法:這是工作有一個基本的文件

#!/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值>/sys/class/gpio/gpioxx/value檢測到事件,但是如果將該引腳配置爲輸入並將其連接到3v3或0V,則不會觸發任何事件。

有人知道我如何才能使用腳本觸發此更改嗎?

回答

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 

再次進行調試。

+0

Downvoters,請提供反饋或推理。 –

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 

現在,你必須找到呼籲/sys/class/gpio/gpioN/valuepoll(或pselect)的命令。 (我會更新我的答案,如果我找到一個)

0

您可以使用libgpiod提供一些有用的工具來監視GPIO。但是,您需要使用Linux 4.8提供的新GPIO API。