为什么读取linux 设备文件event,数据读不全

发布于 2022-09-23 13:42:21 字数 3419 浏览 15 评论 0

我使用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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

青衫负雪 2022-09-30 13:42:21

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

浪漫人生路 2022-09-30 13:42:21

原帖由 dreamice 于 2008-12-27 17:18 发表
你读取的小于实际上传得可能是在你读取的特定时刻,实际上传的数据确实比较少;
另外,这里看不到你底层驱动的实现,也不好分析。

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文