USB-Hub verliert Daten von USB-zu-Seriell-Adaptern

USB-Hub verliert Daten von USB-zu-Seriell-Adaptern

Ich entwerfe derzeit ein System, das Daten von seriellen Geräten (hauptsächlich ARM-Boards) empfangen muss. Dazu verwende ich einige USB-zu-Seriell-Adapter (FTDI232). Ich habe ein einfaches Loopback-Programm (9600 Baud) codiert, um das Setup zu testen, habe das ARM-Board geflasht und konnte erfolgreich alles empfangen, was ich gesendet habe, ohne Datenverlust.

Dieses System muss jedoch irgendwann mit vielen Boards kommunizieren. Daher habe ich einen USB-Hub an den USB-Port angeschlossen und ihn verwendet, um weitere Boards anzuschließen. Nach ein paar Tagen bemerkten wir jedoch einige Probleme. Zuerst schien es, als hätten wir ein paar Bitflips. Dann stellte sich heraus, dass sogar ganze Bytes verloren gingen, wenn wir Nachrichten von den Boards empfingen. Als wir diese Adapter an normale USB-Ports anschlossen (ohne einen Hub dazwischen), verschwand das Problem.

Wir gingen davon aus, dass es sich um ein Pufferproblem handelt. Vielleicht sendet der serielle Controller oder das Gerät seine Daten zu schnell. Daher haben wir auf der seriellen Seite eine RTS/CTS-Flusskontrolle installiert. Auch hier wurden die Bytes von USB-Hubs gelöscht und nicht, wenn der serielle Adapter direkt an den PC angeschlossen ist.

Wir haben den USB-Hub gegen einen teureren ausgetauscht, aber das hat nichts geändert. Wir haben den PC gewechselt, aber das hat das Problem auch nicht gelöst. Außerdem ist es verwirrend, dass der Hub keine Pakete verwirft, die wir an den seriellen Adapter senden, sondern nur die Pakete, die vom seriellen Adapter gesendet werden.

Weiß jemand, wie ich das lösen könnte oder was das Problem verursacht? Wir denken, dass der USB-Hub das Problem verursacht. Wir sind jedoch darauf angewiesen, da wir viele Geräte anschließen müssen. Bevor wir also unsere eigene serielle Handhabungslösung (dedizierter FPGA oder Pi-basiert) erstellen, wollte ich fragen, ob hier jemand weiß, was los ist. Gibt es Linux-Konfigurationsdateien, die möglicherweise schnelleres Polling ermöglichen (falls es ein Polling-Problem ist)? Ich denke, der serielle Adapter ist hier nicht das Problem.

Antwort1

Um dies zu erreichen, verwende ich einige USB-zu-Seriell-Adapter (FTDI232)

Besorgen Sie sich bessere Adapter, die das USB 2.0 HS-Protokoll verwenden. Bei FS-Geräten über HS-Hubs muss der Host das Split-Transaction-Protokoll verwenden, das aufgrund seiner schrecklichen Komplexität für Implementierungsschwierigkeiten bekannt ist. Ich würde nicht wetten, dass die Split-Transaction-Engine jemals auf einer großen Anzahl von miesen FS-UART-Brücken getestet wurde.

Die andere Sache ist, dass viele USB 2.0-Hubs nur ein einziges TT haben, sodass die Gesamtleistung schlecht ist und Pufferung/Planung sehr sorgfältig erfolgen müssen. Auch hier gilt, dass mit dem verrückten CDC-Polling-Protokoll alles möglich sein sollte. Besorgen Sie sich eine bessere USB-UART-Brücke, etwas auf FT232H-Basis.

Der Unterschied zwischen einer direkten Host-Verbindung und einer Verbindung über einen USB-Hub besteht darin, dass im Host-Fall die Transaktionen direkt im nativen FS-Protokoll ausgeführt werden, während für die Verbindung über Hubs ein spezieller Treiber erforderlich ist, der mit geteilten Transaktionen funktioniert. Möglicherweise verfügen Sie über einen schwachen Treiber für geteilte Transaktionen.

Antwort2

Seien Sie vorsichtig, wenn Sie USB2- und USB3-Geräte und -Schnittstellen mischen. Bei einer solchen Mischung können einige Probleme auftreten. Denken Sie außerdem daran, dass einige USB-Hubs einfach Mist sind.

verwandte Informationen