首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >热插拔事件不工作libubs 1.0

热插拔事件不工作libubs 1.0
EN

Stack Overflow用户
提问于 2014-02-27 19:34:20
回答 1查看 2.7K关注 0票数 3

我正在尝试从这个example在我的libusb-1.0代码中实现设备附加/分离事件。

下面是我是如何使用它的:

代码语言:javascript
复制
void registerCallBack() {

    int rc;
    libusb_init(NULL);
    rc = libusb_hotplug_register_callback(NULL, (libusb_hotplug_event) (LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED |
                                            LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT), LIBUSB_HOTPLUG_ENUMERATE,
                                            0x2047, LIBUSB_HOTPLUG_MATCH_ANY,
                                            LIBUSB_HOTPLUG_MATCH_ANY, hotplug_callback, NULL,
                                            &handle);
    if (LIBUSB_SUCCESS != rc) {
        printf("Error creating a hotplug callback\n");
        libusb_exit(NULL);
        return;
    }
    printf("Success registering callback\n");
}

回调函数本身:

代码语言:javascript
复制
int hotplug_callback(struct libusb_context *ctx, struct libusb_device *dev,
                        libusb_hotplug_event event, void *user_data) {
    printf("EVENT! %d\n", event);
    callJava(); // call java method when event fires
    return 0;
}

如果我运行此代码,并且设备具有attached - fires事件,因为LIBUSB_HOTPLUG_ENUMERATE已设置。但如果我在程序运行时尝试连接/分离设备,则什么也不会发生。如果我将标志设置为0(不是LIBUSB_HOTPLUG_ENUMERATE),则不会发生任何事件。

我有Ubuntu Linux 13.10libusb-1.0.16-3。回调注册成功。

附言:我在Java程序的C++库中使用libusb。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2014-03-15 22:57:52

我也遇到了同样的问题,通过一些调试,我发现热插拔事件本身正在发生,并被推送到事件管道中。然而,从libusb源代码来看,我没有看到任何专门的线程来轮询这些事件。事件轮询(和回调调用)似乎是作为通用事务请求处理的一部分完成的。因此,我怀疑(虽然我自己还没有测试过这一点),您必须发出控制或数据请求才能看到热插拔回调。

您可以尝试派生一个线程来使用NULL超时参数调用libusb_handle_events_timeout_completed(),可能每秒一次。这可能会给你你想要的。

如果这是正确的,我希望libusb在libusb_init()上有一个标志来创建一个专门用于热插拔事件的线程,而不依赖于控制/数据请求调用。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22067259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档