2016-12-22 9 views
0

Копаясь с отчетами/для HID, я столкнулся с странной проблемой в устройстве USB HID. Я реализую устройство класса HID и основываю свою программу на программе HID USB, поставляемой Keil. Некоторые коды были изменены в этом проекте и, похоже, работают нормально с 32 байтами ввода и 32 байт выходных отчетов. Каким-то образом, после того, как передача данных через тысячи раз, Endpoint 1 out зависает и становится плохой трубой. Затем я искал в Google некоторые советы, тема напоминала мне, что мы должны написать нулевой пакет длины данных после отправки длины пакета в соответствии с тем, что вы определили в описании отчета. Но это не работает для меня. Затем я пишу нуль данных в контрольный канал после того, как получаю пакет и волшебным образом, он работает! Он никогда не будет висеть после того, как миллион раз перейдет!usb hid: зачем мне записывать «нуль» в управляющий канал в прерывании от конечной точки

У меня есть вопрос: Почему это работает после записи длины данных в ноль к управляющей трубе. Передача данных в выходной трубе не должна иметь отношения к данным в контрольной трубе. Это меня смущает!

+0

См: [Задать] и, пожалуйста, показать [MCVE]. Вы даже не потрудились завершить 2-минутный тур по сайту, прежде чем спрашивать. –

ответ

0

Если вы переносите любые данные, которые меньше ожидаемого размера полезной нагрузки, вы должны отправить пакет нулевой длины, чтобы указать, что данные были переданы.

Но это сильно зависит от реализации на контроллере хоста, и не все устройства следуют спецификации в точку и могут останавливаться.

Источник:
When do USB Hosts require a zero-length IN packet at the end of a Control Read Transfer?

+0

Благодарим за сообщение. Информация, которую вы предложили, действительно оказала мне большую помощь. Я понял, что причиной, по которой мне нужно отправить ZLP после отправки USB-пакета, является то, что каждая транзакция USB OUT требует ACK с устройства после успешной отправки USB-пакета. Не нужно указывать размер полезной нагрузки, отправляемой устройством. –

+0

исправить комментарий: не после отправки, это после получения. –