我有一个通用的设计问题,最终的软件最终会在Linux和Windows上运行......
我试图在端点上用libusb_interrupt_transfer读取8个字节,并且在接收数据的中间发生LIBUSB_ERROR_TIMEOUT ...是否会破坏数据?文档警告要为要接收的数据的'length'变量指定除实际端点数据大小之外的任何内容;它可能导致缓冲区溢出。此外,文档还说如果发生超时检查“已传输”变量,并且并非所有数据都已收到。这两件事情都是真的,我该如何处理部分收到的数据呢?如果发生LIBUSB_ERROR_TIMEOUT并且我的数据包只有8个字节,那么总是会收到所有8个字节吗?我应该总是提供一个8字节的缓冲区,即使我只是请求接收接下来的2个字节来完成先前超时的读取请求?如果我提供8字节缓冲区,并且只请求2个字节,那么我可能最终得到下一个传入的数据包的6个字节?即使我只要求2个字节?任何信息都非常感谢。
http://libusb.sourceforge.net/api-1.0/group__syncio.html#gac412bda21b7ecf57e4c76877d78e6486 libusb docs声明“在处理超时错误代码时也检查转移.libusb可能必须将转移分成若干块以满足基本的O / S要求”
http://libusb.sourceforge.net/api-1.0/packetoverflow.html docs说:“在批量端点上请求数据时,libusb要求您提供一个缓冲区以及libusb可以放入该缓冲区的最大数据字节数。但是,缓冲区的大小不会传递给设备 - 设备只是被要求发送任何数量的数据。“
然后它还指出:“只有在传入数据传输中的最终数据包小于设备要传输的实际数据包时才会发生溢出。因此,如果传输缓冲区大小为a,则永远不会出现溢出端点数据包大小的倍数:最终数据包将完全填满或仅部分填充。“
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);