libusb中断传输
libusb interrupt transfer
我需要为定制的HID USB设备(控制面板上的一些按钮和LED)反向设计一个驱动程序。该驱动程序仅在Windows上可用,我们需要*nix实现。
该设备显然是HID设备,尽管不是特定类别的设备。它提供了两个接口,每个接口都有一个中断端点。
我的设置目前涉及在Ubuntu主机上运行Windows的VirtualBox,以通过Wireshark捕获USB流量。协议相当简单,我已经有了相当好的理解。
我在一个简单的C++控制台程序中使用libusb-1.0进行原型设计。我已经通过发出SET_REPORT控制传输来切换LED,但在通过传输中断接收按钮按下时遇到了困难。
事实上,以下调用将永远阻止:
unsigned char bytes[8] = { 0 };
int len = 0;
int ret = libusb_interrupt_transfer(handle, 0x81, bytes, 8, &len, 0);
在Wireshark中检查生成的URB时,它看起来与Windows会话中捕获的URB完全相同。尽管如此,我从未收到设备的回复。
我跌倒了,我错过了一些环境。请注意,该设备已正确打开,并且该设备提供的两个接口都已成功声明。即使在我的linux应用程序中,通过控制传输的输入报告也会出现问题。
谢谢你的指点!Arne
附录一:我想知道在使用libusb_interrupt_transfer()
时,我应该如何指定要接收的报告id?
附录二:当将windows驱动程序发出的请求与Wireshark中上述代码生成的请求进行比较时,我没有看到任何差异(URB中的值相同)。但是,只有当Windows驱动程序发出中断时,中断传输才会返回。
当检查Wireshark中的Windows驱动程序通信时,除了各种GET_DESCRIPTOR(...)
之外,我没有看到任何控制传输。最重要的是:没有SET_INTERFACE
或SET_CONFIGURATION
因此,我怀疑问题与库或我如何使用它有关,并且与设备无关。
我遇到了同样的问题,libusb_interrupt_transfer()
永远阻止读取端点(bEndpointAddress:0x81 EP 1 IN(lsusb -v
的输出)),但已经解决。
就我而言,我是这样写的。
#define ENDPOINT_IN 0x81
unsigned char buffer[8];
int len = 0;
int ret = libusb_interrupt_transfer(handle, ENDPOINT_IN, buffer, sizeof(buffer), &len, 0);
但是,我的设备需要在读取数据之前发送一些代码,
并且尽管CCD_ 7的输出CCD_。
#define ENDPOINT_OUT 0x01
#define ENDPOINT_IN 0x81
unsigned char buffer[64] = {0x20, 0x01, 0x03, 0x02, 0x07};
int len = 0;
int send_ret = libusb_interrupt_transfer(handle, ENDPOINT_OUT, buffer, sizeof(buffer), &len, 0);
int recv_ret = libusb_interrupt_transfer(handle, ENDPOINT_IN, buffer, sizeof(buffer), &len, 0);
CCD_ 9取决于设备规格。
希望这能有所帮助。
您发布的代码有问题。您为定义bytes
而编写的语法不会产生一个8字节的数组,但您请求libusb将8字节写入该地址,因此可能会出现错误或内存损坏。试试这个:
unsigned char buffer[8];
int len = 0;
int ret = libusb_interrupt_transfer(handle, 0x81, buffer, sizeof(buffer), &len, 0);
每个HID报告都有自己的端点,因此您可以通过指定正确的端点来指定要接收的报告。您指定了端点1 IN(0x81)。你确定在设备的描述符中定义了端点吗?也许你应该得到描述符(在Ubuntu中使用lsusb -v
)并将它们发布在这里,这样我们就可以检查它们了。
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- Angelscript从C++传输数组
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 从服务器传输到客户端的消息不会出现
- 类成员和中断
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- USB传输的LibUSB C++格式不同
- 在本地网络中通过OpenCV(C++)实时流式传输图像
- 我的代码运行良好,但在游戏循环中中断
- 将相机数据从服务器实时流式传输到客户端
- 使用带有MCP23017的 pigpio 进行中断读取
- 加密在 Windows、C++ 和 Java 中传输中的数据
- 为什么我在 AVR 中的中断无法正常工作?
- 如何从网站获取数据并将其传输到数据库?
- 使用蓝牙组件将数据从Android手机传输到串行设备时出现问题
- 使用 UDP 中断 while()-循环
- 在PROGMEM中添加更多数据会中断Arduino Mega 2560上的SPI传输
- 使用 Libusb 1.0 发送中断传输会返回LIBUSB_ERROR_IO,但在接收时不会
- libusb中断传输
- 将外部中断产生的数据从c++程序传输到Linux中的Java