批量传输发送太多(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; }
我正在尝试解决的问题
我正在使用 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; }