【问题标题】:Bulk transfer sending too much (multiple of usb packet?)批量传输发送过多(多个 USB 数据包?)
【发布时间】: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


    【解决方案1】:

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

    所以这实际上似乎有效:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-28
      • 1970-01-01
      • 1970-01-01
      • 2019-03-20
      • 2019-01-15
      • 2010-11-23
      • 2015-02-23
      相关资源
      最近更新 更多