免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4719 | 回复: 2
打印 上一主题 下一主题

为什么读取linux 设备文件event,数据读不全 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-26 20:00 |只看该作者 |倒序浏览
我使用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 编辑 ]

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
2 [报告]
发表于 2008-12-27 17:18 |只看该作者

回复 #1 immember 的帖子

你读取的小于实际上传得可能是在你读取的特定时刻,实际上传的数据确实比较少;
另外,这里看不到你底层驱动的实现,也不好分析。

论坛徽章:
0
3 [报告]
发表于 2008-12-29 08:35 |只看该作者
原帖由 dreamice 于 2008-12-27 17:18 发表
你读取的小于实际上传得可能是在你读取的特定时刻,实际上传的数据确实比较少;
另外,这里看不到你底层驱动的实现,也不好分析。


其实我的这个自定义的USB hid 设备在windows里面用bus hound抓过数据,是没有问题的,每次都上传12byte数据.
此外我比较赞同你的"特定时刻"说法,因为我有的时候读的数据长度是正确的.但如果是这个问题,怎么能解决呢.
至于底层驱动,我是用的是2.6.26内核默认的usbhid驱动,我没有改过.

对于我的这些问题,我最想用的方法就是自己写底层驱动,可是现在系统使用默认的usbhid,并且编译倒了内核之中,而非(.ko文件)模块.usbhid拦截了我的设备,使我自己写的驱动无法生效
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP