libusb异步中断传输使用说明

基于libusbx-1.0.18-rc1,libusbx现已重新merage到libusb。
1. 初始化
使用libusb_init初始化libusb,如果是单设备通信,ctx参数可以传NULL,表示使用默认Context.
2. 注册hotplug事件侦听
从1.0.16开始,libusb支持hotplug事件侦听,可以使用接口libusb_hotplug_register_callback注册基于以下几种filter的回调函数:
libusb_hotplug_event: 分LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED和 LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT俩种;
vendor_id:只有指定的vendor id匹配的设备能够触发回调,或设置LIBUSB_HOTPLUG_MATCH_ANY,使得任意vendor id的设备都能触发回调;
product_id:只有指定的product id匹配的设备能够触发回调,或设置LIBUSB_HOTPLUG_MATCH_ANY,使得任意product id的设备都能触发回调;
dev_class:只有指定的device class匹配的设备能够触发回调,或设置LIBUSB_HOTPLUG_MATCH_ANY,使得任意device class的设备都能触发回调。
这几种filter之间可以以“与”的方式组合一起发生作用。
3. 获取file descriptors
使用libusb_get_pollfds可以取得当前context的fd列表,之后可以将这些fd放到main events loop中进行poll操作。可以参考《基于glib的单线程多事件源处理》这篇文章,使用GSource来实现。一旦检测到有事件发生,要使用libusb_handle_events_completed,触发后面提到的事件处理函数。还需要使用libusb_set_pollfd_notifiers注册俩个回调函数,用来处理设备接入或移除后,fd列表发生的变化。
4. 设备接入
设备接入后,会触发libusb_set_pollfd_notifiers注册的回调函数,通知应用程序有新增的fd,这时需要将新增的fd添加到poll的队列中。同时,libusb还会触发libusb_hotplug_register_callback注册的回调函数,通知应用程序有设备接入。在hotplug的回调函数中,需要基于传入的libusb_device,调用libusb_open接口,创建一个基于此设备的handle。之后根据需要,使用libusb_reset_device重置此设备。对于一些linux标准支持的设备(如HID设备),可能需要使用libusb_detach_kernel_driver,或libusb_set_auto_detach_kernel_driver,将kernel提供的驱动卸载掉,否则会与libusb的通信产生冲突。对于支持多configuration的设备,还需要使用libusb_set_configuration,选择要使用的configuration number。之后,调用libusb_claim_interface,选择要使用的interface。
5. 建立通信
调用libusb_alloc_transfer创建一个空的transfer数据结构,使用libusb_fill_interrupt_transfer填充这个数据结构,参数包括:通信基于的endpoint number,数据到达的buffer及大小,数据到达后的回调函数等。之后调用libusb_submit_transfer,将这个transfer提交给libusb侦听数据到达事件。
6. 数据到达
数据到达后,会触发回调函数,传入之前的transfer数据结构。首先要判断transfer中的status字段是否是LIBUSB_TRANSFER_COMPLETED,否则执行相应的异常处理。对于传输完成的数据,可以到transfer中的buffer字段获取,数据的长度使用actual_length表示。处理完成后,要使用libusb_submit_transfer重新提交这个transfer。
到此,基于libusb的异步通信建立完毕,libusb异步通信对于同步通信来说有更好的性能,且不需要多线程支持,程序执行的时序可以得到更好的控制。

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: libusb是一个用户态的通用USB驱动程序库,用于在操作系统中进行USB设备的访问和控制。异步传输是指在进行USB数据传输时,不需要等待传输完成再进行下一步操作,而是可以同时进行其他操作。 对于摄像头来说,使用libusb进行异步传输可以带来一些好处。首先,异步传输可以提高摄像头的数据传输效率。传统的同步传输会等待每一帧数据传输完成后再进行下一帧的传输,而异步传输可以在当前传输进行的同时开始下一帧的传输,极大地提高了数据传输速度和帧率。 其次,异步传输还可以降低摄像头与计算机之间的延迟。由于异步传输不需要等待传输完成才能进行下一步操作,因此可以更早地对接收到的数据进行处理和分析,从而减少处理延迟。 另外,使用libusb进行异步传输还可以提高对摄像头的控制灵活性。通过异步传输,可以同时进行数据传输和控制命令的发送,例如对摄像头进行设置或调整参数。这样可以实现更加复杂的场景和功能,例如实时调节摄像头的焦距、曝光等参数。 总之,libusb异步传输可以提高摄像头的数据传输效率和控制灵活性,并降低延迟,对于需要高效地传输和控制摄像头数据的应用场景来说,是一个非常有用的工具。 ### 回答2: libusb是一个开源的跨平台的USB访问库,它允许开发人员通过USB接口与USB设备进行通信。摄像头通常通过USB接口与计算机连接,因此可以使用libusb异步传输摄像头数据。 异步传输意味着在进行数据传输时,计算机可以同时执行其他任务,而不必等待传输完成。在摄像头应用中,异步传输能够提高数据传输的效率和响应速度,使得图像和视频流可以更加流畅地展示。 当使用libusb进行异步传输时,首先需要打开摄像头设备并初始化libusb库。然后,可以使用libusb提供的接口函数将传输任务添加到传输队列中,并指定回调函数来处理传输完成后的数据。 在传输过程中,libusb会负责与摄像头设备进行通信,并在数据传输完成后调用回调函数来处理接收到的数据。开发人员可以在回调函数中对数据进行处理,比如解码、显示、保存等操作。 使用libusb进行摄像头数据的异步传输可以提高系统的性能和响应速度,特别适用于需要实时展示摄像头图像或者进行实时图像处理的应用。另外,libusb提供了丰富的接口函数和示例代码,使得开发人员可以轻松实现对摄像头数据的异步传输,并根据自身需求进行二次开发。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值