批量传输发送太多(USB 数据包的倍数?)

Bulk transfer sending too much (multiple of usb packet?)

我正在尝试解决的问题

我正在使用 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 的 return 代码都是 0(成功),第一个说它发送了 buffer_len 字节(如预期的那样),第二个说它发送了 0 字节(如预期的那样) .

但我的接收器仍然收到比预期更长的数据包。我尝试使用 64 而不是 256(因此发送了更多的零长度数据包),但我仍然遇到同样的问题。

我错过了什么?

问题是并发引起的:两个线程在调用我上面的代码,因此有时一个线程没有时间在数据包之后立即发送零长度数据包。

所以这似乎确实有效:

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);
}

int get_usb_packet_size() { return endpoint_out->wMaxPacketSize; }