包的概念
USB规范描述了数据如何通过含有端点描述符定义包大小限制的包进行传输,主机不能发送数据负荷超过端点描述符包最大值。
Libusb和底层系统抽象出包的概念,允许你请求传输任何大小的包。在内部请求将被分成合适大小的包。你不需要担心包大小的问题,但是有一个列外就是溢出。
批量/中端传输溢出
当在一个批量端点上请求数据时, libusb要求你提供一个缓冲区,足够大以至于libusb可以将最大值的数据放入到缓冲区中。但是,设备并不知道缓冲区的大小——设备仅仅是被要求发送任意长度的数据。
如果设备发送了小于或等于缓冲区大小的数据是没有问题的。libusb将通过 libusb_transfer.actual_length字段向你报告实际的传输的数据。
问题发生在设备尝试发送多于缓冲区所能接收的数据。在这种情况下libusb报告 LIBUSB_TRANSFER_OVERFLOW错误,但是其他是未定义的: actual_length也许是也许不是准确的,缓冲区内的数据块 (在溢出前)也许是也许不是已经被传输的。
溢出是让人痛苦的,但是可以避免。即使你被告知忽略上面的包,思考下更低一等级的细节:每个传输是被分成包 (很小,最大不超过512字节)。溢出只能发生在最后一个包比设备想要传输的实际包小的情况下。因此,如果你传输缓冲区大小是端点包大小的倍数,你永远不会看溢出的情况:最后一个包要么完整填充要么只有部分被填充。