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