Linux 从gpio输入读取的字节数为零

Linux 从gpio输入读取的字节数为零,linux,io,gpio,sysfs,Linux,Io,Gpio,Sysfs,我有一些奇怪的行为时,试图读取gpio输出引脚。 我得到第一次读取返回1(读取1字节),但所有来自同一gpio的下一次读取返回0。我假设它应该总是读1,因为总是有一些东西可以从输入引脚读取 gpio = 8; fd = open("/sys/class/gpio/export", O_WRONLY); sprintf(buf, "%d", gpio); rc = write(fd, buf, strlen(buf)); if (rc == -1) printf("failed in wr

我有一些奇怪的行为时,试图读取gpio输出引脚。 我得到第一次读取返回1(读取1字节),但所有来自同一gpio的下一次读取返回0。我假设它应该总是读1,因为总是有一些东西可以从输入引脚读取

gpio = 8;
fd = open("/sys/class/gpio/export", O_WRONLY);
sprintf(buf, "%d", gpio);
rc = write(fd, buf, strlen(buf));
if (rc == -1)
    printf("failed in write 17\n");
close(fd);
sprintf(buf, "/sys/class/gpio/gpio%d/direction", gpio);
fd = open(buf, O_WRONLY);
rc = write(fd, "in", 2);
if (rc == -1)
    printf("failed in write 18\n");
close(fd);
sprintf(buf, "/sys/class/gpio/gpio%d/value", gpio);
gpio_tdo = open(buf, O_RDWR);
rc = read(gpio_tdo, &value, 1);   <-- rc here is 1

rc = read(gpio_tdo, &value, 1);   <-- rc here is 0

rc = read(gpio_tdo, &value, 1);   <-- rc here is 0
gpio=8;
fd=打开(“/sys/class/gpio/export”,仅限O_wr);
sprintf(buf,“%d”,gpio);
rc=写入(fd、buf、strlen(buf));
如果(rc==-1)
printf(“写入失败17\n”);
关闭(fd);
sprintf(buf,“/sys/class/gpio/gpio%d/方向”,gpio);
fd=打开(仅限buf、O_);
rc=写入(fd,“in”,2);
如果(rc==-1)
printf(“写入失败18\n”);
关闭(fd);
sprintf(buf,“/sys/class/gpio/gpio%d/value”,gpio);
gpio_tdo=打开(buf,O_RDWR);
rc=读取(gpio\U tdo和值,1) 发件人:

在支持查找的文件上,读取操作从当前文件偏移量开始,文件偏移量按读取的字节数递增。如果当前文件偏移量位于或超过文件的末尾不读取任何字节,并且read()返回零

因此,您可能需要在二读之前执行,如下所示:

read(gpio_tdo, &value, 1);
lseek(gpio_tdo, 0, SEEK_SET);
read(gpio_tdo, &value, 1);
第二种选择是关闭文件并重新打开,然后再执行第二次读取:

close(gpio_tdo);
gpio_tdo = open(buf, O_RDWR);
read(gpio_tdo, &value, 1);
但这似乎有点过头了。我会选择第一个选项(
lseek

有用的阅读: