【问题标题】:number bytes read from gpio input is zero从 gpio 输入读取的字节数为零
【发布时间】:2015-03-03 19:04:18
【问题描述】:

我在尝试读取 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 ?

【问题讨论】:

    标签: linux io gpio sysfs


    【解决方案1】:

    来自man read

    在支持查找的文件上,读取操作从当前文件偏移量开始,文件偏移量增加读取的字节数。如果当前文件 offset 位于或超过 文件结尾,则不读取任何字节,并且 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

    【讨论】:

      猜你喜欢
      • 2017-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      相关资源
      最近更新 更多