尝试读取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输入读取一个字节是否总是返回1?
答案 0 :(得分:1)
来自man read:
在支持搜索的文件上,读取操作从当前文件偏移开始,文件偏移量增加读取的字节数。如果当前文件偏移处于或超过文件末尾,则不读取任何字节,而read()将返回零。
所以你可能需要在第二次阅读前执行lseek,如下所示:
read(gpio_tdo, &value, 1);
lseek(gpio_tdo, 0, SEEK_SET);
read(gpio_tdo, &value, 1);
您的第二个选择是关闭文件并在第二次read
之前重新打开它:
close(gpio_tdo);
gpio_tdo = open(buf, O_RDWR);
read(gpio_tdo, &value, 1);
但似乎有点开销。我选择了第一个选项(lseek
)。
有用的阅读:gpio in sysfs