У меня есть USB-считыватель карт RFID, который эмулирует клавиатуру. Итак, когда я кладу карту, я вижу строку в терминальном окне -i.e. "0684a24bc1"
Чтение с/dev/input
Но я хотел бы прочитать его в моей программе на C. Нет проблем при использовании: scanf("%s",buff);
Но когда я использую код ниже, я получил много (около 500 байт) не распознанных данных. Почему? Я хотел бы иметь неблокирующее чтение.
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
int main(int argc, char ** argv) {
int fd;
char buf[256];
fd = open("/dev/input/event3", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1) {
perror("open_port: Unable to open /dev/ttyAMA0 - ");
return(-1);
}
// Turn off blocking for reads, use (fd, F_SETFL, FNDELAY) if you want that
fcntl(fd, F_SETFL, 0);
}
while(1){
n = read(fd, (void*)buf, 255);
if (n < 0) {
perror("Read failed - ");
return -1;
} else if (n == 0) printf("No data on port\n");
else {
buf[n] = '\0';
printf("%i bytes read : %s", n, buf);
}
sleep(1);
printf("i'm still doing something");
}
close(fd);
return 0;
}
Разве вы не устанавливаете флаг 'O_NONBLOCK', чтобы сделать дескриптор неблокирующим? –
Кроме того, при чтении непосредственно с устройства вы читаете данные _raw_ до того, как они преобразуются в символы, которые вы можете читать с терминала. –
Я просто хочу добавить, что это отвратительная реализация драйвера RFID. он должен быть реализован как символьное устройство. – stdcall