在raspberry pi 1上,raspbian stretch lite 9.1版 - 内核版本4.9.52 +
我制作了一个shell程序,通过raspberry pi的gpio点亮了一个led(文件名是led.sh)。我需要与某些文件交互的部分:
function makeOn {
# status has value 1 if led is on and 0 if led is off
if [ $(status) -eq 1 ]; then
echo "led is already on"
else
#say we are using pin 18 and set it to output mode
echo "18" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio18/direction # this is line 38
# write output
echo "1" > /sys/class/gpio/gpio18/value # this is line 41
echo "led is on"
fi
}
我是以gpio组中的用户身份运行的。这些是我试图在我的程序中弄乱的文件:
当我运行led.sh时会发生这种情况:
奇怪的是,我一个接一个地在shell上运行这些命令,没问题。但是当我运行一个调用它们的脚本时,即使我在gpio组中,我也会被拒绝。首先,我认为shell可以作为特殊用户运行命令,并通过在几个位置向led.sh添加echo $ EUID进行检查,并且它们都返回了我的用户ID。
为什么此程序对这些文件的权限被拒绝,如何授予/修复此权限?
答案 0 :(得分:0)
所以我做了一些实验,这就是我得到的:
起初我考虑过像chmod 777这样的问题文件只是为了测试,然后我记得那不会起作用,因为这些文件是在echo "18" > /sys/class/gpio/export
导出引脚时创建的。 / p>
所以我认为这可能是问题,并在其后添加sleep 0.1
,以便系统有时间"正确创建和设置文件的权限"。它现在有效。
答案 1 :(得分:0)
如何在sleep
之后立即添加gpio/export
echo "18" > /sys/class/gpio/export
sleep 0.1
这似乎是一个时间问题。
答案 2 :(得分:-1)
对于 Ubuntu 运行。
sudo apt install rpi.gpio-common.
但如果对于 Raspberry OS,该软件包不可用,则安装文件的内容是。
$ cat /lib/udev/rules.d/60-rpi.gpio-common.rules
SUBSYSTEM=="bcm2835-gpiomem", KERNEL=="gpiomem", GROUP="dialout", MODE="0660"
SUBSYSTEM=="gpio", KERNEL=="gpiochip*", ACTION=="add", PROGRAM="/bin/sh -c 'chown root:dialout /sys/class/gpio/export /sys/class/gpio/unexport ; chmod 220 /sys/class/gpio/export /sys/class/gpio/unexport'"
SUBSYSTEM=="gpio", KERNEL=="gpio*", ACTION=="add", PROGRAM="/bin/sh -c 'chown root:dialout /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value ; chmod 660 /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value'"
将其放入 /etc/udev/rules.d/
。