代码之家  ›  专栏  ›  技术社区  ›  rosaqq

当用户在gpio组raspberry pi上运行时,gpio脚本返回权限被拒绝

  •  0
  • rosaqq  · 技术社区  · 7 年前

    在raspberry pi 1上,raspbian stretch lite 9.1版-内核版本4.9.52+

    我制作了一个shell程序,通过raspberry pi的gpio(文件名为led.sh)点亮led。有一部分我需要与一些文件交互:

    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组中的用户身份运行此程序。以下是我试图在程序中处理的文件:

    enter image description here

    enter image description here

    enter image description here

    奇怪的是,我在shell上一个接一个地运行这些命令,没有问题。但是,当我运行调用它们的脚本时,即使我在gpio组中,我也会被拒绝权限。首先,我认为shell可以作为特殊用户运行命令,并通过向led添加echo$EUID进行检查。在几个地方,他们都返回了我的用户id。

    为什么该程序对这些文件的权限被拒绝,我如何授予权限/修复?

    3 回复  |  直到 7 年前
        1
  •  0
  •   Pang Ajmal PraveeN    7 年前

    添加一个 sleep 刚好在…之后 gpio/export

    echo "18" > /sys/class/gpio/export
    sleep 0.1
    

    这似乎是一个时机问题。

        2
  •  0
  •   rosaqq    4 年前

    在中导出接点时,会创建值文件和方向文件 echo "18" > /sys/class/gpio/export

    需要小延迟(例如: sleep 0.1

    一个工作示例是:

    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
        # added to allow time for the file to be created before trying to use it
        sleep 0.1
        echo "out" > /sys/class/gpio/gpio18/direction
    
        # write output
        echo "1" > /sys/class/gpio/gpio18/value
        echo "led is on"
      fi
    }
    
        3
  •  -1
  •   4xy    4 年前

    用于Ubuntu运行。

    sudo apt install rpi.gpio-common.
    

    $ 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/ .