libusb_fill_iso_transfer的用法

原文链接:添加链接描述

比如libusb_fill_iso_transfer的使用的支持情况:

libusb-1.0.22(1.0.21也支持,但没测试过,二者会有些区别)版本提供libusb_fill_iso_transfer函数接口
支持的平台:在使用libusbk驱动的情况下,win7和win10都是支持的
支持的驱动:目前来看使用winusb是不行的,必须使用libusbk才可以,否则在submit_transfer的时候会报错NOT_SUPPORT
官方解释:http://windows.libusb.info

2.官方的东西,有时也会出现很多让你感觉无语的问题,并没有想象中的那么完美,所以你要找官方提供的解释和说明:

先粘几个链接:

官方网站:http://libusb.info/
接口函数的使用说明:http://api.libusb.info
其他问题:https://github.com/libusb/libusb/wiki/FAQ
这里重点说一下关于异步接口的问题:

1.为什么要做这么一个异步接口?和同步接口有什么差异?有什么优缺点?

这里我先举例简单说明一下同步和异步的差异,比如A和B通话,A想告诉B一个秘密,A有两种选择:打电话和发短信,那么同步方式就像这里的打电话,A给B打电话,B必须得接,A才能把秘密告诉B,B如果不接,A就一直等待什么也做不了,这就是block(阻塞),在使用同步接口的时候,当前线程就会被独占,直到完成为止。为了避免出现B一直不接电话,A一直等待的情况,我们加入了timeout机制,即如果A给B打电话时间超过一分钟(timeout),我就先挂掉电话,等会儿再打;异步的方式就像发短信,我把秘密用短信编辑好发给你,我就可以做其他事情去了,不会在这儿等待。异步接口在使用时不会造成block(阻塞),不会去等待结果完成才退出,而是使用接口后立马退出,即使该行为还没有触发!优缺点如下:

同步接口一次只能控制一个设备的一个端点,简单的对时间要求不是很高的应用推荐使用同步接口,原因就是简单
如果要同时控制多个设备的多个端点,就必须要使用异步接口
2.我们在使用control setup,interrupt,bulk端点时使用同步接口就可以满足要求,但是isochronous transfer必须使用asynchronous I/O,关于同步接口的问题官方给出了详细的说明,这里先粘出链接,再解释遇到的一些问题:

官方解释:http://libusb.sourceforge.net/api-1.0/libusb_io.html

官方接口说明:http://libusb.sourceforge.net/api-1.0/group__libusb__asyncio.html

接口API使用时的注意事项:

1.必须libusb_claim_interface,同步端点对应的interface必须要进行声明,否则报错

2.必须libusb_set_interface_alt_setting,必须要进行设置,否则发不出数据

3.必须在fill_iso_transfer之后调用libusb_set_iso_packet_lengths设置长度

4.submit transfer成功发送完成之后,才可以再次submit,切记不要在报错时再次submit 否则只能不断报错

问题如下:

1.在按顺序submit transfer的时候,有时并不会按照顺序发送和接收,比如我按照顺序先发送再接收,结果一会儿出现一直发送,一会儿又出现一直接收,一会儿又先发送后接收,不像是放入同一个队列里进行的操作

2.在不同平台的现象不一致,在公司试过几台不同的电脑,有的运行很顺利,有的就很容易报错

暂时分享这么多

这里粘贴一个非常稳定的demo给大家,里面还有很多细节没有来得及琢磨,有需要的可以查看:
————————————————
版权声明:本文为CSDN博主「Aaron_Forever_Young」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Aaron_lu123/article/details/106213103

相关推荐
libusb1.0学习(一) 首先声明,这是看到国外论坛上的学习文章后,独立翻译过来作为笔记用,加入部分自我理解,并且全部原创。 介绍: libusb是一个开源库,可以帮助开发者在用户空间的层面上与UBS设备进行通讯。如果想了解更多,可以查看他们的主页:http://libusb.org/ 在其文档中,建议首先阅读USB2的规格说明:http://www.usb.org/developers/docs/,这可以帮助真正地了解USB是如何工作的。 libusb的安装: 你可以从官方的主页上获取源代码,并且编译安装。或者使用的发行版已经包含了软件包,可以很方便地安装。 如果已经安装完毕,请继续往下 通讯: 设备和客户端之间的通讯是个清楚的概念叫做使用管道。每个管道都是一个主机上的一个软件和设备上一个端点的通道。每个端点对于设备来说完成一部分特殊的目标,比如接受命令或者传输数据。一个全速设备最高可以拥有16个端点,然后低速的设备只拥有三个端点。 所有的USB设备当供电时都支持端口0。这个端口是默认的目标管道。当设备连接被检测到后,USBD软件会使用端口0来初始化设备,执行普通的(非特殊)配置,并且获得有设备提供的其他端点的信息。端点是以他们的端点数目(取决于设计的时间),总线宽带,访问频率,延迟和处理错误要求为特征区分的。 一旦设备里的端点识别并且配置完毕,管道就产生允许客户端软件与设备进行通讯。跟一个管道产生联系是以对总线的访问和带宽,传输的类型,传输的方向和最大数据负载大小为描述特征的。 USB定义了四种传输方式:控制传输,通常用来传输命令和状态操作;中断传输,通过设备初始化一些来自主机的请求;同步传输,用来传输投递关键事件的数据(比如视频和对话);批量传输,使用全部可以用的带宽但不是特定时间的。所有的数传使用相同格式的包装,包括控制信息,数据和错误效验区域。 这里有两种管道:消息管道和流管道。控制传输是使用消息管道。在消息管道中,在每个包中的数据部分对于USB系统软件是有意义的。 流管道被中断传输,同步传输和批量传输使用。在流管道中,在每个包中的数据部分对于USB是没有意义,仅仅在客户端软件和设备间传输。 同步接口: 同步接口允许你使用单独一个函数调用一个USB传输。当这个函数调用返回时,这个传输也已经完成并且返回结果供解析用。这种方式的优点是十分清晰的:你可以通过一个简单的函数调用做任何事。 尽管如此,这个接口还是有它的局限性。你的程序会进入休眠当在libusb_bulk_transfer()(当进行批量传输),直到传输完成。假如这需要花费三个小时,你的程序同样需要休眠同样的时间。实现将会在库里面结束,整体线程这期间是无用的。另一个问题是,当一个单独的传输线程结束,这里不存在可能多个端点和多个设备同时地进行I/O操作,除非你借助创造新的线程处理。另外的,当请求被提交后,这里没有机会可能取消传输。 设备和接口: 在libusb中,每个USB设备通过libusb_device和libusb_device_handle对象操作。libusb API 连接一个打开的设备至特定的接口。这意味着如果你在设备上请求多个接口,你必须同样多次打开设备来接受一个libusb_dev_handle,对应每个你想进行通讯的接口。不要忘记调用libusb_dev_handle。 这些意味着什么?这意味你在设备上操作以前,可以完成请求接口,同样,你可以在完成设备操作前,先释放接口。 每个设备都有自己独属的配置,比如vendor id,product id等。我们使用这些设置去发现需求的设备,并且通过这些配置来工作。首先我们写一个函数来查明这些配置并且打印出来,以便我们找到正确的一个;我们基本的操作如下: 1.通过调用libusb_init来初始化库,同时创建一个对话; 2.调用libusb_get_device_list来获得已经连接的设备的队列。这会创建一个libusb_device的数组,包含了所有连接到系统上的usb设备; 3.循环遍历所有的设备来检查他们的选项; 4.发现其中需要的一个,使用libusb_open或者libusb_open_device_with_vid_pid(当你知道这个设备vendor id和product id)来打开设备; 5.使用libusb_free_device_list清除使用libusb_get_device_list获得的队列; 6.通过libusb_claim_interface请求接口(需要你知道设备的接口数值); 7.操作想得到的I/O; 8.通过libusb_release_interface释放设备; 9.通过libusb_close将你之前打开的设备关闭; 10.通过libusb_exit来关闭
©️2020 CSDN 皮肤主题: 撸撸猫 设计师:马嘣嘣 返回首页