C语言 write()返回EINVAL,但我可以回显,打开和读取



我正在尝试写入嵌入式平台上的GPIO引脚,我已经编写了读取引脚的代码(成功),并且还通过回显文件(成功)进行了测试。

可能产生此错误的最小代码:

static int write_gpio(int gpio_num, int data)
{
char buf[50];
int nwritten, file_desc;
int attempts;
snprintf(buf, sizeof(buf), "/sys/class/gpio/gpio%d/value", gpio_num);
file_desc = open(buf, O_WRONLY);
if (file_desc < 0)
{
printf("Failed to open gpio %d valuen", gpio_num);
return -1;
}
for (attempts = 0; attempts < 10; attempts++)
{
nwritten = write(file_desc, (void*) &data, 1);
if (nwritten > 0)
{
break;
}
}
close(file_desc);
if (nwritten == -1)
{
fprintf(stderr, "GPIO Write %d to %d failedn", gpio_num);
return -1;
}
return 0;
}

读取代码非常相似,除了打开文件的方式和write()被read()取代。这段代码可以工作。我也可以做一个成功的echo 1 > /sys/class/gpio/gpio[n]/value

这是怎么回事?手册指出,当文件不可写时给出EINVAL,但是这个文件显然是可写的,我只是用echo命令

完成了它。

我会让@NateEldredge发布正确的解决方案来解决你遇到的问题。我只是想指出第二个想法,通过使用GPIO驱动程序上的ioctl函数来解决问题。

我发现这个解决方案更"c -ish";而不是打开文件描述符并写入字符串(因为我认为这种方法更像是"命令行")。以下代码的源代码可以在这里找到。

static int write_gpio(int gpio_num, int data)
{
char buf[50];
int nwritten, file_desc;
int attempts;
snprintf(buf, sizeof(buf), "/sys/class/gpio/gpio%d/value", gpio_num);
file_desc = open(buf, O_WRONLY);
if (file_desc < 0)
{
printf("Failed to open gpio %d valuen", gpio_num);
return -1;
}

// Set lines as OUTPUTS
struct gpiohandle_request rq;
rq.lineoffsets[0] = <DATA_LINE>;
rq.lines = 1;
rq.flags = GPIOHANDLE_REQUEST_OUTPUT;

ret = ioctl(file_desc, GPIO_GET_LINEHANDLE_IOCTL, &rq);
close(file_desc);
if (ret == -1)
{
printf("Unable to line handle from ioctl : %s", strerror(errno));
close(fd);
return;
}
// Write 1 to GPIO
struct gpiohandle_data data;
data.values[0] = 1; // HIGH offset 17
ret = ioctl(rq.fd, GPIOHANDLE_SET_LINE_VALUES_IOCTL, &data);
if (ret == -1)
{
printf("Unable to set line value using ioctl : %s", strerror(errno));
}
close(rq.fd);
return 0;
}

相关内容

最新更新