【问题标题】:How to recover from webusb response status: "babble"如何从 webusb 响应状态中恢复:“babble”
【发布时间】:2018-06-30 06:57:52
【问题描述】:

我正在 Chrome 上测试新的 webusb api (https://wicg.github.io/webusb/),并正在测试从 USB 设备发送 (transferOut) 和接收 (transferIn)。

它工作得很好,但我尝试读取的数据比预期的要少(2 个字节而不是 3 个字节,其中消息的长度实际上用前两个字节表示)。

问题是当我读取的字节数少于预期时,USB api 返回状态“babble”。之后如何保证正常通信?我仍然可以发送数据,但接收数据总是返回错误“DOMException:发生传输错误。”

我尝试运行 device.clearHalt("in", 1)(方向“in”和端点 1),但它也不起作用(抛出“DOMException: Unable to clear endpoint.”)。

有人遇到过这个问题吗?

(我在 OSX 上使用 Chrome 65.0.3325.181)

【问题讨论】:

  • 我目前正在调查这种行为。您可以在 crbug.com 上提交问题来描述问题吗?
  • 作为记录,我遇到了完全相同的问题,但在我的情况下,我需要始终一次读取 1 个字节,所以我总是在做 transferIn(1, 1)... @ReillyGrant您能否向我们提供有关此问题的最新信息,或者至少将我们与正在处理的问题联系起来?谢谢
  • @gutemberg-ribeiro 检查下面 ReillyGrant 的答案。显然,解决这个问题的最好方法是调用 transferIn ,其长度是端点最大数据包大小的倍数。没试过。
  • @olivervbk 我试过了,但是在实践中我们不能这样做......例如,我们的设备总是报告 max==64。因此,如果我尝试 2 或 64,我很有可能永远不会完成该调用,因为没有数据(发生在这里)。 API 没有解决承诺并说“嘿,我们没有更多数据了”。因此,按字节读取使我的情况更安全。否则,我将不得不继续管理我请求的数量和收到的数量,以停止调用 transferIn()... 非常糟糕的体验...
  • @GutembergRibeiro 是的,我尝试按字节传递数据,但我放弃了,最终用预定义的消息格式将所有内容包装在 Protobuf 中。 AFAICT USB 不是为单字节通信而设计的。

标签: javascript google-chrome usb webusb


【解决方案1】:

如上所述,我仍在研究从 babble 错误中恢复的最佳方法,但无论如何解决此问题的最简单方法是避免调用 transferIn() 时的长度不是端点的最大数据包大小。在软件中处理额外数据比尝试从硬件协议错误中恢复要容易得多。

【讨论】:

    猜你喜欢
    • 2021-01-13
    • 1970-01-01
    • 2017-03-05
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 2015-05-16
    相关资源
    最近更新 更多