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