0

我想确保在连接到 Chrome(通过 WebUSB)端点的设备上不包含来自以前批量传输的消息。我检查了 WebUSB 的 API: https ://wicg.github.io/webusb/ ,我没有看到任何允许清空缓冲区的刷新函数。我正在考虑在设备返回 NAK 之前读取数据 - 如下所示:

/* #1 Make sure that IN endpoint contains no more data */
while (true) {
  let result = await data.transferIn(1, 6);
  if (result.length === 0) {
      break;
  }
}

/* #2 Send request */
await data.transferOut(0x81, message);

/* #3 Receive valid request */
let result = await data.transferIn(1, 6);

但不幸的是,看起来没有好的解决方案:

  • 当没有更多数据要读取时, transferIn() 成为阻塞函数 - 所以我们不能在异步调用 transferIn() 上进行中继
  • 当在超时的承诺中调用 transferIn() 时,我们可以以多个等待传入数据的承诺结束(这很糟糕,因为我们不知道哪个承诺会接收数据)

确保设备 IN 端点不包含数据的最佳方法是什么?

4

1 回答 1

0

USB 规范中不存在“IN 大容量端点缓冲区”的概念。设备是否使用 DATA 或 NACK 响应 IN PID 完全取决于设备。答案可以根据设备状态即时生成,也可以从内部缓冲区提供。主机无法知道缓冲区是“空的”。这是必须在主机和设备之间的更高协议层定义的东西。

例如,主机或设备可以指示预期要传输的数据量。然后主机知道在当前操作完成之前它可以从 IN 端点读取多少数据。这就是 USB 大容量存储协议的工作方式。

如果主机和设备之间的协议没有定义这些类型的消息边界,那么刷新到缓冲区的最佳方法就是不要尝试。相反,始终从 IN 端点读取数据并在接收到数据时对其进行解释。这可能包括setTimeout()用于检查是否已在给定期限内收到对特定请求的响应。如果接收到的不是响应请求的数据,如果它不感兴趣,则可以丢弃它。

于 2019-10-28T20:23:59.357 回答