Как сбросить объемный буфер конечной точки на устройстве - PullRequest
0 голосов
/ 28 октября 2019

Я хотел бы убедиться, что на устройстве, подключенном к Chrome (через WebUSB), конечная точка IN не содержит сообщений от предыдущей массовой передачи. Я проверил API для WebUSB: 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 не содержит данных?

1 Ответ

0 голосов
/ 28 октября 2019

Понятие «IN объемного буфера конечной точки» не существует в спецификации USB. Отвечает ли устройство на IN PID с помощью DATA или NACK, полностью зависит от устройства. Ответ может быть сгенерирован на лету на основе состояния устройства или получен из внутреннего буфера. Хост не может знать, что буфер «пустой». Это то, что должно быть определено на более высоком уровне протокола между хостом и устройством.

Например, хост или устройство могут указывать объем данных, которые, как ожидается, будут переданы. Затем хост знает, сколько данных он может прочитать из конечной точки IN до завершения текущей операции. Вот как работает протокол USB Mass Storage.

Если протокол между хостом и устройством не определяет границы сообщений такого типа, лучший способ очистки в буфер - не пытаться. Вместо этого всегда читайте с конечной точки IN и интерпретируйте данные по мере их поступления. Это может включать использование setTimeout() для проверки того, был ли получен ответ на конкретный запрос в течение заданного срока. Данные, полученные не в ответ на запрос, могут быть отброшены, если они неинтересны.

...