是否可以使用 libusb 为同一个 USB 设备创建多个连接实例?
Is it possible to create multiple connection instances to same USB device using libusb?
我正在考虑如何创建多线程应用程序以使用 libusb 将非顺序消息发送到 USB 设备。
两个选项是:
创建单个 USB 设备连接并具有多个线程
共享单个连接?
创建到同一设备的多个 libusb 连接允许
每个线程都有自己的连接?
(1) 应该可以在相关的 libusb 调用上使用一些同步互斥锁。
我不确定 (2) 是否可行 - 如果可行,实施起来可能更简单?
这是问题的上下文,但具体问题是:
是否可以使用 libusb 为同一个 USB 设备创建多个连接实例?
请参阅下面的一个小而完整的 C 程序,该程序证明可以对同一 USB 设备进行多个连接。
如果您想使用它,您必须为您的设备适当地修改 VID 和 PID 值。还假设设备根据主机的控制请求进行批量传输。
检查 r_1
和 r_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;
}
我正在考虑如何创建多线程应用程序以使用 libusb 将非顺序消息发送到 USB 设备。
两个选项是:
创建单个 USB 设备连接并具有多个线程 共享单个连接?
创建到同一设备的多个 libusb 连接允许 每个线程都有自己的连接?
(1) 应该可以在相关的 libusb 调用上使用一些同步互斥锁。
我不确定 (2) 是否可行 - 如果可行,实施起来可能更简单?
这是问题的上下文,但具体问题是:
是否可以使用 libusb 为同一个 USB 设备创建多个连接实例?
请参阅下面的一个小而完整的 C 程序,该程序证明可以对同一 USB 设备进行多个连接。
如果您想使用它,您必须为您的设备适当地修改 VID 和 PID 值。还假设设备根据主机的控制请求进行批量传输。
检查 r_1
和 r_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;
}