Я пишу код для устройства USB. Предположим, что USB-хост запускает передачу управляющего чтения для чтения некоторых данных с устройства, а количество запрашиваемых данных (wLength в пакете установки) кратно максимальному размеру пакета Endpoint 0. Затем, после того как хост получит все данные (в виде нескольких транзакций IN с пакетами данных максимального размера), он инициирует еще одну транзакцию IN, чтобы посмотреть, есть ли еще данные, хотя их не может быть больше?
Вот пример последовательности событий, которые меня интересуют:
- Процесс перечисления USB: максимальный размер пакета в конечной точке 0, как сообщается, равен 64.
- Транзакция SETUP-DATA-ACK запускает передачу управляющего чтения, wLength = 128.
- Транзакция IN-DATA-ACK доставляет первые 64 байта данных на хост.
- Транзакция IN-DATA-ACK доставляет на хост последние 64 байта данных.
- IN-DATA-ACK с пакетом данных нулевой длины? Эта транзакция когда-либо случалась?
- транзакция OUT-DATA-ACK завершает фазу состояния передачи; передача окончена.
Я проверил это на своем компьютере (Windows Vista, если это имеет значение), и получил ответ нет : хост был достаточно умен, чтобы знать, что с устройства больше нельзя получить данные, даже если все пакеты, отправленные устройством, были заполнены (максимально допустимый размер на конечной точке 0). Мне интересно, есть ли какие-нибудь хосты, которые не достаточно умны, и будут пытаться выполнить другую транзакцию IN и ожидать получения пакета данных нулевой длины.
Я думаю, что прочитал соответствующие части спецификаций USB 2.0 и USB 3.0 с usb.org, но я не нашел эту проблему решенной. Буду признателен, если кто-нибудь укажет мне правый раздел в любом из этих документов.
Я знаю, что пакет нулевой длины может быть необходим, если устройство решит отправить меньше данных, чем запрашиваемый хост в wLength.
Я знаю, что мог бы сделать свой код достаточно гибким, чтобы справиться с любым случаем, но я надеюсь, что не должен.
Спасибо всем, кто может ответить на этот вопрос!