是否可以使用libusb为同一USB设备创建多个连接实例?

时间:2018-03-07 13:41:03

标签: c multithreading libusb-1.0

我正在考虑如何创建一个多线程应用程序,使用libusb将非顺序消息发送到USB设备。

这两个选项是:

  1. 创建单个USB设备连接并具有多个线程 分享那个单一的连接?

  2. 创建多个libusb连接到同一设备允许     每个线程都有自己的连接?

  3. (1)应该可以在相关的libusb调用上使用一些同步互斥。

    我不确定(2)是否可能 - 如果可能,它可能更容易实现?

    这是问题的背景,但具体问题是:

    是否可以使用libusb为同一USB设备创建多个连接实例?

1 个答案:

答案 0 :(得分:0)

请参阅下面的小型但完整的C程序,证明可以与同一USB设备建立多个连接。

如果要使用它,则必须为您的设备适当修改VID和PID值。还假设设备根据来自主机的控制请求进行批量传输。

检查r_1r_2 libusb_bulk_transfer调用buf值表示使用两个USB句柄的批量传输已成功完成,即每个传输中都存在预期的数据包数据

/**
 * \brief test whether it is possible to have two connections to same usb device
 */

#include <stdio.h>
#include <libusb-1.0/libusb.h>

int main()
{
    int r_1;
    int r_2;

    libusb_device_handle *handle_1;
    libusb_device_handle *handle_2;

    uint8_t bmRequestType = 0x40 | 0x00| 0x00;
    uint8_t bRequest = 0x90;

    unsigned char buf[12008];
    int n;

    r_1 = libusb_init(NULL);
    r_2 = libusb_init(NULL);

    handle_1 = libusb_open_device_with_vid_pid(NULL, 0xFFFF, 0x0001);
    handle_2 = libusb_open_device_with_vid_pid(NULL, 0xFFFF, 0x0001);    

    libusb_claim_interface(handle_1, 0);
    libusb_claim_interface(handle_2, 0);

    r_1 = libusb_control_transfer(handle_1, bmRequestType,
                                  bRequest, 0, 0, NULL,
                                  0, 5000);

    r_1 = libusb_bulk_transfer(handle_1, 129,
                               buf, 12008, &n,
                               5000);

    r_2 = libusb_control_transfer(handle_2, bmRequestType,
                                  bRequest, 0, 0, NULL,
                                  0, 5000);

    r_2 = libusb_bulk_transfer(handle_2, 129,
                               buf, 12008, &n,
                               5000);

    printf("All Done!\n");
    return 0;
}