Raspberry pi GPIO sysfs,fopen:权限被拒绝

问题描述 投票:0回答:1

我正在尝试使用 C 语言通过 sysfs 使用 raspberry pi GPIO,但在尝试更改 GPIO 线路方向时,我不断收到

fopen: Permission denied

尝试打开文件时出现问题
"/sys/class/gpio/gpio18/direction"
.

备注:

  • 如果我第二次运行该程序,它运行良好。
  • 如果我手动导出 GPIO 行然后执行它就可以正常工作。
  • 如果我以 root 身份运行该程序,它工作正常。
  • 我当前的用户是 gpio 组的一部分,应该拥有所有权限。

通常我需要把我想用的别针放在

"/sys/class/gpio/export"
.
然后我需要通过将
1
0
写到
"/sys/class/gpio/gpio18/direction"
来设置它的方向(输出/输入)。

为了以编程方式实现,我使用以下代码

#include "io.h"
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>

int main(int argc, char const* argv[]) {
  // export line
  FILE* p_gpio_line;
  if ((p_gpio_line = fopen("/sys/class/gpio/export", "w")) == NULL) {
    printf("Cannot open export file.\n");
    perror("fopen");
    exit(1);
  }
  rewind(p_gpio_line);
  fwrite("18", sizeof(char), 2, p_gpio_line);
  fclose(p_gpio_line);

  // set direction
  FILE* p_gpio_direction;
  if ((p_gpio_direction = fopen("/sys/class/gpio/gpio18/direction", "r+")) == NULL) {
    printf("Cannot open direction file.\n");
    perror("fopen");
    exit(1);
  }
  return 0;
}

第一次执行我得到

Cannot open direction file.
fopen: Permission denied

第二次运行正常,因为GPIO线在程序执行前导出(从第一次执行开始)
如果我从终端手动导出 GPIO 线,它也可以正常工作

c raspberry-pi fopen gpio sysfs
1个回答
0
投票

My comment about

perror()
remains effect, but indeed in your example
fopen()
returns EPERM.

Group

gpio
/sys/class/gpio
的权限特定于 Raspberry Pi 发行版。它们由
/etc/udev/rules.d/99-com.rules
:

中的 udev 规则设置
SUBSYSTEM=="gpio", ACTION=="add", PROGRAM="/bin/sh -c 'chgrp -R gpio /sys%p && chmod -R g=u /sys%p'"

direction
文件出现后,异步应用Udev规则。您正在尝试打开文件,但尚未设置权限。

我建议使用带有 libgpiod 的字符设备 GPIO 接口,而不是弃用的 sysfs 接口。

© www.soinside.com 2019 - 2024. All rights reserved.