我正在尝试使用 C 语言通过 sysfs 使用 raspberry pi GPIO,但在尝试更改 GPIO 线路方向时,我不断收到
fopen: Permission denied
。"/sys/class/gpio/gpio18/direction"
.
备注:
通常我需要把我想用的别针放在
"/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 线,它也可以正常工作
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 接口。