2015-03-03 4 views
2

У меня есть странное поведение при попытке считывания вывода вывода gpio. Я получаю, что первый прочитанный return 1 (1 байт прочитан), но все последующие считываются из того же gpio return 0. Я бы предположил, что он всегда должен читать 1, потому что всегда есть что-то читать с входного вывода.Число байтов, считанных с входа gpio, равно нулю

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?

ответ

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

+0

Это работает, спасибо! – ransh