从/ dev / input读取

我有一个模拟键盘的USB RFID读卡器。 所以,当我把一张卡片,我看到一个terminal窗口上的string-ie "0684a24bc1"

但我想在我的C程序中读取它。 当我使用scanf("%s",buff);时没有问题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; } 

Solutions Collecting From Web of "从/ dev / input读取"

根据Linux输入文档 ,第5节,/ dev / input / eventX设备返回数据如下:

您可以使用阻塞读取和非阻塞读取,也可以使用/ dev / input / eventX设备上的select(),并且读取时总是会获得大量的输入事件。 他们的布局是:

 struct input_event { struct timeval time; unsigned short type; unsigned short code; unsigned int value; }; 

“时间”是时间戳,它返回事件发生的时间。 类型例如是相对时刻的EV_REL,按键或释放的EV_KEY。 include / linux / input.h中定义了更多的类型。

'code'是事件代码,例如REL_X或KEY_BACKSPACE,同样的完整列表在include / linux / input.h中。

“价值”是事件的价值。 EV_REL的相对变化,EV_ABS的绝对新值(操纵杆…),或者EV_KEY的释放为0,按键为1,自动重复为2。

/dev/input/下打开一个事件设备时,你的代码显然是错误的。 即使你的错误信息是矛盾的选择:

 perror("open_port: Unable to open /dev/ttyAMA0 - "); 

/dev/input/eventN文件读取返回带有事件描述的二进制数据(如指针移动或按下按钮),而不是文本。 您可能需要打开某种串行仿真设备。