Raspberry pi gpio读取文件的方向在c中不起作用,除非程序已再次运行且gpio引脚未报告

Raspberry pi gpio读取文件的方向在c中不起作用,除非程序已再次运行且gpio引脚未报告,c,raspberry-pi,raspberry-pi3,gpio,sysfs,C,Raspberry Pi,Raspberry Pi3,Gpio,Sysfs,因此,我试图在c中为gpio控制创建一个库(使用sysfs),在我创建“gpio_change_direction”函数之前,其他一切都正常工作,该函数应该按照所需的方向(例如“out”)写入方向文件。问题是,这不起作用,因为“fopen”(包含在标准库中)函数返回null,但在第二次运行程序时它确实起作用。如果没有未移植gpio引脚,它将不起作用,但是如果没有移植引脚,它将不起作用。顺便说一句,我使用的是Raspberry pi 3B,但是这个程序在任何Raspberry pi设备上都应该是一

因此,我试图在c中为gpio控制创建一个库(使用sysfs),在我创建“gpio_change_direction”函数之前,其他一切都正常工作,该函数应该按照所需的方向(例如“out”)写入方向文件。问题是,这不起作用,因为“fopen”(包含在标准库中)函数返回null,但在第二次运行程序时它确实起作用。如果没有未移植gpio引脚,它将不起作用,但是如果没有移植引脚,它将不起作用。顺便说一句,我使用的是Raspberry pi 3B,但是这个程序在任何Raspberry pi设备上都应该是一样的,因为它使用sysfs而不是直接寄存器控制。当然,我使用GNU/Linux来实现这一点,确切地说是拉斯宾

下面是gpio_change_direction函数的代码:

uint8_t gpio_change_direction(uint8_t gpio, char *direction) {
    FILE *fdirection;

    char *direction_filename;

    direction_filename = (char *)malloc(sizeof(char) * (strlen(GPIODIR) + GPIO_FILENAME_CHAR_SIZE + strlen("/direction")));

    strcpy(direction_filename, GPIODIR);
    strcat(direction_filename, "gpio");
    strcat(direction_filename, int_to_string(gpio)); 
    strcat(direction_filename, "/direction");

    fdirection = fopen(direction_filename, "w");
    puts("Hello");
    printf("fdirection: %p %d %s\n", fdirection, fdirection, direction_filename);

    if(fdirection == NULL) {
        puts("Helerror timelo!");
        return(FILE_ERROR);
    }

    fputs(direction, fdirection);

    fclose(fdirection);
    return(0);
}
int main(int argv, char *argc[]) {
    int i;
    char *d;

    d = (char *)malloc(sizeof(char) * 3);

    gpio_export(24);
    gpio_read_direction(24, d);
    printf("direction: %s\n", d);

    gpio_change_direction(24, GPIO_OUT);

    gpio_read_direction(24, d);
    printf("direction: %s\n", d);

    gpio_unexport(24); //Works if this is removed and then the program is ran again

    return(0);
}
FILE_ERROR常量是在我创建的gpio_sysfs.h头文件中定义的

我用来测试gpio_change_direction函数的主函数(这还不是真正的库,所以它有一个主文件):

uint8_t gpio_change_direction(uint8_t gpio, char *direction) {
    FILE *fdirection;

    char *direction_filename;

    direction_filename = (char *)malloc(sizeof(char) * (strlen(GPIODIR) + GPIO_FILENAME_CHAR_SIZE + strlen("/direction")));

    strcpy(direction_filename, GPIODIR);
    strcat(direction_filename, "gpio");
    strcat(direction_filename, int_to_string(gpio)); 
    strcat(direction_filename, "/direction");

    fdirection = fopen(direction_filename, "w");
    puts("Hello");
    printf("fdirection: %p %d %s\n", fdirection, fdirection, direction_filename);

    if(fdirection == NULL) {
        puts("Helerror timelo!");
        return(FILE_ERROR);
    }

    fputs(direction, fdirection);

    fclose(fdirection);
    return(0);
}
int main(int argv, char *argc[]) {
    int i;
    char *d;

    d = (char *)malloc(sizeof(char) * 3);

    gpio_export(24);
    gpio_read_direction(24, d);
    printf("direction: %s\n", d);

    gpio_change_direction(24, GPIO_OUT);

    gpio_read_direction(24, d);
    printf("direction: %s\n", d);

    gpio_unexport(24); //Works if this is removed and then the program is ran again

    return(0);
}
如果删除了带有gpio_unexport的行,则该行将在第二次运行

我已经更改了数百次代码,并尝试了很多很多事情,我将感谢任何帮助,并提前感谢您

下面是libgpio_sysfs.c文件的pastebin链接:
这里是gpio_sysfs.h文件:

如果将
gpio_export(24)
替换为将
24
写入
/sys/class/gpio/export
文件,并对
gpio_unexport(24)
执行类似操作,您能试试吗?如果这是正确的,那么您使用的库中一定有不好的东西。您的定义看起来可疑:
#define EXPORTFILE gpioir“export”
,当您以这种方式连接时,您将得到:
“/sys/class/gpio/”“export”
。此外,您没有在
is\u gpio\u exported
函数中正确关闭目录。当找到匹配的文件时,您从函数返回而不调用
closedir(dir)
@itachi将24写入/sys/class/gpio/export文件是什么意思?我敢肯定,这正是gpio_导出函数所做的。您认为gpio_导出文件目前的作用是什么?您说“如果您将gpio_导出(24)替换为写入24…”,您可以尝试一下会发生什么情况吗?但这让我们不清楚该函数当前的功能是什么。很抱歉回答得太晚。我说的是直接执行
echo 24>/sys/class/gpio/export
,例如通过
system()
函数。我感觉您的定义和导出的
函数有问题。