【发布时间】:2021-11-23 17:23:27
【问题描述】:
我要解决的问题
我正在使用 libusb_bulk_transfer 通过 USB 发送数据,如下所示:
int sent = 0;
int bulk_result = libusb_bulk_transfer(handle, endpoint_out->bEndpointAddress, buffer,
buffer_len, &sent, 5000);
我在 Kotlin (Android) 的另一端收到这些转移。
大多数时候,它是有效的:我发送一个缓冲区,比如说,289 字节,而在另一边我收到 289 字节。
但是,有时我收到的太多了。假设我发送了 1536 个字节,我收到了 1719 个字节。
我的解决方案不起作用
我的理解(例如来自here)是“当批量传输已传输所请求的确切数据量、传输小于最大端点大小的数据包或传输零长度数据包时,它被认为已完成” .
因为 1536 是 64 的倍数(而且我收到的所有错误数据包都是 64 的倍数),所以我认为这是我的问题。因此,在我发送了一个最大端点大小的倍数的缓冲区后,我开始发送一个长度为零的数据包。而且我适时注意到最大端点大小不一定是 64,所以我想检测它。
这是我的“解决方案”:
int sent = 0;
int bulk_result = libusb_bulk_transfer(handle, endpoint_out->bEndpointAddress, buffer,
buffer_len, &sent, 5000);
if (sent % get_usb_packet_size() == 0) {
libusb_bulk_transfer(handle, endpoint_out->bEndpointAddress, nullptr, 0, &sent, 5000);
}
下面是简单的get_usb_packet_size(),恰好是256:
int get_usb_packet_size() { return endpoint_out->wMaxPacketSize; }
不过,这似乎不起作用! libusb_bulk_transfer 的返回码都是 0(成功),第一个表示它发送了 buffer_len 字节(如预期),第二个表示它发送了 0 个字节(如预期)。
但我的接收器仍然收到比预期更长的数据包。我尝试使用 64 而不是 256(因此发送更多零长度数据包),但我仍然遇到同样的问题。
我错过了什么?
【问题讨论】:
标签: usb libusb libusb-1.0