libusb使用详解七(USB设备的数据传输之异步模式)

通过libusb实现USB设备数据的异步传输主要有如下几步:

  1. 创建libusb_transfer对象
  2. 根据不同的传输方式填充相应信息给libusb_transfer对象
  3. 提交libusb_transfer对象给libusb API进行执行
  4. 在传输回调函数中检查libusb_transfer对象中的状态信息
  5. 释放libusb_transfer对象

下面我们来依次介绍

1. 创建libusb_transfer对象

可以使用libusb_alloc_transfer函数来创建libusb_transfer对象,函数定义如下:

struct libusb_transfer * libusb_alloc_transfer (int iso_packets)

其中:
iso_packets:用于指明在实时传输时需要传输的包的数量。对于其它三种传输方式设为0即可
返回值:libusb_transfer对象指针

2. 填充libusb_transfer对象

填充libusb_transfer对象的函数根据传输方式各不相同。

2.1 控制传输

控制传输主要使用libusb_fill_control_setup和libusb_fill_control_transfer函数把控制传输所需信息填充到libusb_transfer对象中。

static void libusb_fill_control_setup (
    unsigned char *buffer,
    uint8_t bmRequestType,
    uint8_t bRequest,
    uint16_t wValue,
    uint16_t wIndex,
    uint16_t wLength)

大多数的参数和同步模式传输函数libusb_control_transfer中的类似,可参考上一节的内容。其中:
buffer:为待生成的Setup命令的Buffer指针,大小必须是2的倍数
bmRequestType:  为Control Setup包的request type部分
bRequest: 为Control Setup包的request命令
wValue: 为Control Setup包的value部分,该值需要根据Request命令设定相应的值
wIndex: 为Control Setup包的index部分,设置方式和wValue类似
wLength:为Control Setup包请求读取数据时传入buffer的最大长度,只有从USB设备读取数据时需要。

而后需要使用函数libusb_fill_control_transfer把使用libusb_fill_control_setup构建的Setup包和额外数据buffer填充给libusb_transfer对象。libusb_fill_control_transfer函数定义如下:

static void libusb_fill_control_transfer (
    struct libusb_transfer *transfer,
    libusb_device_handle *dev_handle,
    unsigned char *buffer,
    libusb_transfer_cb_fn callback,
    void *user_data,
    unsigned int timeout)

其中:
transfer:为待填充的libusb_transfer对象,后续不再赘述
dev_handle:为待传输的USB设备的设备句柄,后续不再赘述
buffer: 为刚刚构建的Setup包和额外的数据Buffer,额外的数据Buffer追加在Setup包后
callback: 为本次传输的回调函数,关于libusb_transfer_cb_fn回调函数后续会详细介绍
user_data: 为传入回调函数的user data
timeout:为传输的超时时间,单位ms。0表示永不超时

2.2 中断传输

中断传输使用libusb_fill_interrupt_transfer来填充信息到libusb_transfer对象中。函数定义如下:


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值