为什么读取linux 设备文件event,数据读不全
我使用evtest.c读取/dev/input/event5,event5是我自定义的usb hid设备的设备文件,可是每次读取该文件,读取的bytes总是小于实际设备上传的bytes.哪位高手能帮我解决一下吗,谢谢了.
以下是代码:
int main (int argc, char **argv)
{
int fd, rd, i, j, k;
struct input_event ev[64];
struct timeval lasttime;
int version;
unsigned short id[4];
unsigned long bit[EV_MAX][NBITS(KEY_MAX)];
char name[256] = "Unknown";
int abs[5];
if ((fd = open("/dev/input/event5", O_RDONLY)) < 0)
{
perror("evtest");
return 1;
}
if (ioctl(fd, EVIOCGVERSION, &version))
{
perror("evtest: can't get version");
return 1;
}
printf("Input driver version is %d.%d.%d\n",
version >> 16, (version >> 8) & 0xff, version & 0xff);
ioctl(fd, EVIOCGID, id);
printf("Input device ID: bus 0x%x vendor 0x%x product 0x%x version 0x%x\n",
id[ID_BUS], id[ID_VENDOR], id[ID_PRODUCT], id[ID_VERSION]);
ioctl(fd, EVIOCGNAME(sizeof(name)), name);
printf("Input device name: \"%s\"\n", name);
memset(bit, 0, sizeof(bit));
ioctl(fd, EVIOCGBIT(0, EV_MAX), bit[0]);
printf("Testing ... (interrupt to exit)\n");
while (1)
{
rd = read(fd, ev, sizeof(struct input_event) * 64);
if (rd < (int) sizeof(struct input_event))
{
printf("yyy\n");
perror("\n evtest: error reading");
return 1;
}
}
close(fd);
}
[ 本帖最后由 dreamice 于 2008-12-26 20:38 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
你读取的小于实际上传得可能是在你读取的特定时刻,实际上传的数据确实比较少;
另外,这里看不到你底层驱动的实现,也不好分析。
其实我的这个自定义的USB hid 设备在windows里面用bus hound抓过数据,是没有问题的,每次都上传12byte数据.
此外我比较赞同你的"特定时刻"说法,因为我有的时候读的数据长度是正确的.但如果是这个问题,怎么能解决呢.
至于底层驱动,我是用的是2.6.26内核默认的usbhid驱动,我没有改过.
对于我的这些问题,我最想用的方法就是自己写底层驱动,可是现在系统使用默认的usbhid,并且编译倒了内核之中,而非(.ko文件)模块.usbhid拦截了我的设备,使我自己写的驱动无法生效