C++ libusb\u中断\u传输libusb\u错误\u超时

C++ libusb\u中断\u传输libusb\u错误\u超时,c++,C++,我有一个一般的设计问题,最终的软件将在Linux和Windows上运行 我试图用LiBuBiStuttTyTrink读取端点上的8个字节,在接收的数据中间出现LIbBuByError超时。数据会被分解吗?文档警告不要为要接收的数据的“长度”变量指定实际端点数据大小以外的任何内容;它可能导致缓冲区溢出。此外,文档还指出,如果检查“已传输”变量发生超时,则可能未收到所有数据。这两件事是真的,我应该如何处理部分接收到的数据?如果发生LIBUSB_ERROR_TIMEOUT,并且我的数据包只有8个字节,

我有一个一般的设计问题,最终的软件将在Linux和Windows上运行

我试图用LiBuBiStuttTyTrink读取端点上的8个字节,在接收的数据中间出现LIbBuByError超时。数据会被分解吗?文档警告不要为要接收的数据的“长度”变量指定实际端点数据大小以外的任何内容;它可能导致缓冲区溢出。此外,文档还指出,如果检查“已传输”变量发生超时,则可能未收到所有数据。这两件事是真的,我应该如何处理部分接收到的数据?如果发生LIBUSB_ERROR_TIMEOUT,并且我的数据包只有8个字节,是否会始终接收所有8个字节?我应该总是提供一个8字节的缓冲区,即使我只是请求接收下2个字节来完成之前超时的读取请求?如果我提供了8字节的缓冲区,并且只请求2字节,那么我可能会得到下一个传入数据包的6字节?即使我只要求2个字节?任何信息都非常感谢

libusb文档声明“在处理超时错误代码时也要检查传输。libusb可能必须将您的传输拆分为多个数据块,以满足底层O/S要求”

docs声明:“当请求批量端点上的数据时,libusb要求您提供一个缓冲区以及libusb可以放入该缓冲区的最大数据字节数。但是,缓冲区的大小不会与设备通信-设备只是被要求发送任意数量的数据。”

然后它还指出:“只有当传入数据传输中的最终数据包小于设备想要传输的实际数据包时,才会发生溢出。因此,如果您的传输缓冲区大小是端点数据包大小的倍数,您将永远不会看到溢出:最终数据包将完全填满或仅部分填满。”


请显示您的代码。我添加了一些示例代码,基本上我想知道如果我们超时,libusb\u interrupt\u传输是否可以接收少于8字节的数据,我预计不会,但我不能100%确定这是否是我需要处理的条件。我相信Windows和Linux不会中断8字节的中断传输。但不确定发生了什么到目前为止,我还无法调用超时将中断8字节的中断数据的条件。如果这种情况发生变化,我将发布更新。我目前正在Debian Linux下进行测试。
unsigned char data[8];
int timeout  = 250; //timeout in milliseconds
int xmtcnt = 0; 
int rcvcnt = 0;

//EP OUT (Send data to USB Device)
//0x02 = Endpoint Type 0x00 + Endpoint Number 2
r = libusb_interrupt_transfer(devh,0x02, data, sizeof(data), &xmtcnt, timeout);
if(r != 0 || xmtcnt != 8){printf("XMT libusb_interrupt_transfer error %d\n",r); goto out_release;}

//EP IN (Recv data from USB device)
//0x81 = Endpoint Type 0x80 + Endpoint Number 1     
//-----IS IT POSSIBLE TO RECEIVE LESS THAN 8 BYTES IF WE TIMEOUT?----   
r = libusb_interrupt_transfer(devh,0x81, data, sizeof(data), &rcvcnt, timeout);
if(r != 0 || rcvcnt != 8){printf("RCV libusb_interrupt_transfer error %d\n",r); goto out_release;}      

//show data received
CONSOLE("data: %d %d %d %d %d %d %d %d xmt:%d rcv:%d\n",data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7],xmtcnt,rcvcnt);