我有一个模拟键盘的USB RFID读卡器。
所以当我把卡片放到它上面时,我会在终端窗口看到字符串-i.e. "0684a24bc1"
但我想在我的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;
}
答案 0 :(得分:10)
根据Linux input documentation第5节,/ dev / input / eventX设备返回如下数据:
你可以使用阻塞和非阻塞读取,也可以使用select() / dev / input / eventX devices,你总能得到一大堆 读取时输入事件。他们的布局是:
struct input_event { struct timeval time; unsigned short type; unsigned short code; unsigned int value; };
'time'是时间戳,它返回事件的时间 发生了。类型是例如EV_REL表示相对时刻,EV_KEY表示相对时刻 按键或释放。 include / linux / input.h中定义了更多类型。
'code'是事件代码,例如REL_X或KEY_BACKSPACE,同样是a 完整列表在include / linux / input.h中。
'value'是事件所携带的值。要么相对改变 EV_REL,EV_ABS的绝对新值(操纵杆......),或EV_KEY的0 释放,1表示按键,2表示自动重复。
答案 1 :(得分:1)
return <div>hi</div>; // ok
return (<div>hi</div>) // ok
return (<div>hi</div>); // ok
$ sudo ./keypressed
读取的总字节数为72/4096
35 49 C9 5C 00 00 00 00 38 27 0B 00 00 00 00 00 04 00 04 00 5A 00 07 00 35 49 C9 5C 00 00 00 00 38 27 0B 00 00 00 00 00 00 01 00 50 00 01 00 00 00 35 49 C9 5C 00 00 00 00 38 27 0B 00 00 00 00 00 00 00 00 00 00 00 00 00 00
这是原始数据,要转换为某些键,我需要先阅读“ Linux输入文档”链接...
答案 2 :(得分:0)
在/dev/input/
下打开事件设备时,您的代码显然是错误的。即使您的错误消息与选择相矛盾:
perror("open_port: Unable to open /dev/ttyAMA0 - ");
从/dev/input/eventN
文件读取返回带有事件描述的二进制数据(如指针移动或按下按钮),而不是文本。您可能想要打开某种串行仿真设备。