2016-12-22 3 views
0

Graben herum mit/für HID-Berichte, stieß ich auf ein seltsames Problem in einem USB-HID-Gerät. Ich implementiere ein Gerät der HID-Klasse und habe mein Programm auf dem von Keil gelieferten HID-USB-Programm basiert. Einige Codes wurden in diesem Projekt geändert und es scheint gut mit 32-Byte-Eingabe- und 32-Byte-Ausgabeberichten zu funktionieren. Irgendwie, nach tausenden von Datenübertragungen, würde der Endpunkt 1 out hängen bleiben und eine schlechte Pipe werden. Dann habe ich im Google nach einigen Tipps gesucht, ein Thema erinnere mich daran, dass wir ein Datenlängen-Null-Paket nach dem Senden einer Paketlänge schreiben sollen, was du in der Berichtsbeschreibung definiert hast. Aber es funktioniert nicht für mich. Dann schreibe ich eine Datenlänge Null in die Kontroll-Pipe, nachdem ich ein Out-Paket erhalten habe und magisch, es funktioniert! Es würde niemals nach Millionen Übertragungen hängen!usb hid: warum sollte ich schreiben "Null" auf die Steuerleitung in der Out-Endpunkt Interrupt

Hier ist meine Frage: Warum funktioniert es nach dem Schreiben einer Datenlänge Null auf eine Steuerleitung. Die Daten, die in der Out-Pipe übertragen werden, sollten keine Beziehung zu den Daten in der Kontroll-Pipe haben. Das verwirrt mich!

+0

Siehe: [Senden Sie uns] und zeigen Sie bitte eine [MCVE]. Sie haben sich auch nicht die Mühe gemacht, die 2-minütige Site-Tour zu beenden, bevor Sie gefragt haben. –

Antwort

0

Wenn Sie Daten übertragen, die unter der erwarteten Nutzlastgröße liegen, müssen Sie ein Zero Length-Paket senden, um anzuzeigen, dass Daten übertragen wurden.

Aber es hängt stark von der Implementierung auf dem Host-Controller ab, und nicht alle Geräte folgen der Spezifikation auf den Punkt und können zum Stillstand kommen.

Quelle:
When do USB Hosts require a zero-length IN packet at the end of a Control Read Transfer?

+0

Vielen Dank für die Antwort. Die Informationen, die du angeboten hast, haben mir sehr geholfen. Ich habe herausgefunden, dass der Grund, warum ich ZLP nach dem Senden eines USB-Pakets senden muss, ist, dass jede USB OUT-Transaktion nach dem erfolgreichen Senden eines USB-Pakets eine ACK vom Gerät benötigt. Nein, wieviel Payload-Größe das Gerät sendet. –

+0

korrigieren Sie den Kommentar: nicht nach dem Senden, Es ist nach dem Empfang. –

Verwandte Themen