Usb-hub zur fehlerbehebung / test / benchmark (Hubs fungieren als Flaschenhals ... Warum?)

781
Mike

Ich verwende ein Ubuntu 14.04 LTS und einige ungewöhnliche serielle Hardware, die Seriell-zu-USB-Wandler verwendet.

Ich kann nicht mehrere langsame Geräte (RS232 zu USB 2.0-Konverter und RS422 zu USB 2.0-Konverter und ein anderes USB 2.0-Gerät) an einen 3.0-Hub anschließen, ohne dass meine Anwendung wegen fehlender eingehender Nachrichten abstürzt. Wenn jedoch alle Geräte direkt an den PC angeschlossen sind, funktioniert alles. Könnten Sie bitte erklären, warum das so ist? Bitte lesen Sie weiter für Details ...

Ich habe einen 3.0 USB-Hub von Orico gekauft. Es verfügt über 4 Anschlüsse und wird über den USB-Anschluss mit Strom versorgt, in den es eingesteckt wird.

Ich habe 2 serielle Konverter (mit Geräten, mit denen gesprochen werden kann) und ein einzelnes USB-Gerät daran angeschlossen. Hier sind die Details:

  • RS422 zu USB (2.0) - konfiguriert als / dev / ttyUSB0 bei 500.000 8N1.
  • RS232 zu USB (2.0) - konfiguriert als / dev / ttyUSB1 bei 115200 8N1.
  • USB 2.0-Gerät (Labjack U3, ein allgemeines E / A-System ... sammelt gedrückte Tasten und ähnliches ...).

Ich habe einige sehr seltsame Verhaltensweisen beobachtet, die mich zwei 14-Stunden-Turbo-Belastung gekostet haben, bis mir klar wurde, dass die Nabe das Problem ist.

"Schlechtes" Verhalten des USB-Hubs, dessen Entdeckung einige Zeit in Anspruch nahm:

  • Als nur RS232 an USB angeschlossen war, empfing das serielle Gerät, mit dem ich kommunizierte, alle Daten, die der PC sendete, aber alle Antworten vom Gerät wurden vom Hub (oder genauer gesagt, so lange wie möglich) verworfen Hub wurde verwendet).
  • Wenn zwei Geräte angeschlossen waren (Labjack USB 2.0-Gerät + RS422 an USB 2.0), funktionierte alles (Meldungen von beiden Geräten kamen mit guter Geschwindigkeit zum PC). Wenn der RS232-zu-USB-Konverter angeschlossen war, während die anderen beiden Geräte bereits angeschlossen waren, war alles noch in Ordnung, und ich konnte den RS232-Port konfigurieren. Sobald jedoch das an den RS232 angeschlossene serielle Gerät eingeschaltet war und mit dem Senden von "Meldungen" begonnen hatte, stürzte die auf dem PC ausgeführte Anwendung mit einem Fehler ab, der darauf hinwies, dass Nachrichten vom RS422-Gerät (das über USB empfangen werden sollte) verhungert waren Nabe). Dies würde innerhalb von 5 Sekunden nach dem Einschalten (Online-Einschalten) des seriellen Geräts geschehen, das an den RS232-zu-USB-Konverter angeschlossen war.

Ich war für eine Weile ratlos ... bis ich den USB-Hub entfernt und alle Geräte direkt an den PC angeschlossen habe ... dann begann alles wie aus einem Guss.

Könnten Sie bitte erklären, warum dies geschieht? Könnten Sie bitte auch einige Tools oder Vorgehensweisen vorschlagen, um genau zu ermitteln, was mit dem USB-Netzwerk schief läuft?

Ich brauche den Hub, um alle seriellen Daten, die in USB-Nachrichten konvertiert werden, ohne Engpass zum PC zu transportieren. und wenn wir bedenken, dass die seriellen Geschwindigkeiten meiner RS232- und RS422-Geräte so langsam sind (im Vergleich zu USB ... und nicht in Bezug auf die Fehlerbehebung ...), würde ich meinen, dass jeder Hub den Trick beherrscht. Nachdem ich dieses Problem entdeckt habe, bin ich neugierig, warum eine Nabe, deren Geschwindigkeit viel schneller ist als die daran angeschlossenen Geräte, als Flaschenhals wirkt.

Bitte beachten Sie, dass der Hub nicht (wahrscheinlich) defekt ist. bis es auf 2 serielle Konverter und ein gleichzeitig angeschlossenes USB-Gerät stößt, an dem Punkt, an dem Geschwindigkeit (oder möglicherweise Spannung) meinen Roboter abstürzt.

################# EDIT # 1

Ich hatte den Verdacht, dass ein Spannungsabfall ein Problem verursacht hatte, also habe ich einen 2.0-USB-7-Port mit Hub und die Ergebnisse waren die gleichen! Die Anwendung wird nach Nachrichten gesucht, sobald alle 3 Geräte mit dem Senden von Nachrichten beginnen.

########################################## EDIT # 2

Wenn ich das RS422-Gerät direkt an den PC und die USB-Geräte RS232 und Labjack an den USB-Hub (und dann den USB-Hub an den PC) anschließen, schlägt der Labjack U3 mit einem Fehler fehl.

Bedeutet dies, dass ein USB-Hub die Daten, die von zwei seriellen Geräten und einem einzelnen USB-Gerät an ihn weitergeleitet werden, nicht mit der Geschwindigkeit weiterleiten kann, mit der die Nachrichten eingehen? Das hört sich wirklich ab.

Wenn ich weitere Informationen geben kann, lass es mich wissen. Danke im Voraus.

2
Einige "orico" stellen nur Leiterplatten und Kunststoffe für Hubs her. Was ist der eigentliche Hub Controller IC in der Box? Es sollte über Deskriptoren gemeldet und in Protokollen dargestellt werden. Was ist es? Ale..chenski vor 6 Jahren 0
@Ali Chen Dies ist die Webseite für das Produkt: http://www.orico.cc/goods.php?id=6056; Sie geben an, dass sie den Via USB3.0-Chip verwenden. Welchen Linux-Befehl kann ich ausführen, um eine bessere Beschreibung zu erhalten? Mike vor 6 Jahren 0
Wenn Sie mit Linux arbeiten, sollten Sie Kernel-Protokolle mit einigen USB-Filtern erstellen können. Wie? Ich habe sehr wenig Ahnung. Sie benötigen keinen besseren Befehl, wenn das Produkt sagt, dass es VIA ist. VIA ist gut. Daher ist Ihre Software fehlerhaft. Wenn Sie es wirklich debuggen möchten, benötigen Sie einen guten USB-Protokollanalysator mit HS-Modus, um zu sehen, warum "alle Antworten von Hub" abgeworfen wurden, eigentlich zwei von ihnen, an beiden Enden des Hubs. Es ist nicht möglich, dass "alle" gelöscht werden. Sie haben wahrscheinlich einen Fehler beim Lesen von Pipes. Ale..chenski vor 6 Jahren 0
Sind Ihre Konverter auch wirklich auf USB 2.0 (HS-Modus, 480 Mbps) oder auf einen Standard-FTDI-Typ mit nur FS-Protokoll? Der "LabJack" ist als FS-Modus aufgeführt. Was sind die anderen Wenn der Hub VL811 / 12/13 ist, hat er nur einen TT, wie ich auf der VIA-Website gefunden habe. Ein TT für 0,5 MBaud und andere Streams werden besteuert. Ale..chenski vor 6 Jahren 0
Orico sagt, es sei VL812. Sie haben einen falschen Hub für den Job gekauft. Suchen Sie nach "Multi-TT" -Naben, USB 2.0 reicht für diesen Job aus. Ale..chenski vor 6 Jahren 0
@Ali Chen Danke für das Erklären mir. Nach eingehenderer Untersuchung wurde mir klar, dass einer der Linux-Treiber abstürzt. Sie hatten recht, es war nicht der USB-Hub. Vielen Dank! Mike vor 6 Jahren 0

1 Antwort auf die Frage

2
Ale..chenski

Bei den RS232-Geräten handelt es sich normalerweise um FS-Geräte, wobei das USB-Protokoll mit 12 MBit / s läuft. Beim Anschluss an einen Hub, USB2 oder USB3, erfolgt die Kommunikation über einen speziellen Kommunikationsprozessor namens "Transaction Translator" oder "TT", der in jeden USB-Hub eingebettet ist. Es gibt zwei Arten von Hubs, diejenigen, die nur einen TT für alle Ports haben, und solche, die einen individuellen TT für jeden Downstream-Port haben.

Wenn Sie mehrere FS-Geräte an einen Single-TT-Hub angeschlossen haben, ist die Pufferressource überlastet und die FS-Bandbreite (12 MBit / s) wird zwischen den verbundenen Geräten gemeinsam genutzt. Um die volle FS-Bandbreite über jede Downstream-Verbindung zu erhalten, benötigen Sie einen sogenannten "Multi-TT" -Hub.

Die Abwicklung von FS-Transaktionen über TT erfordert auch eine spezielle Herangehensweise, die als "Split-Transaktionen" bezeichnet wird.

Moderne Computer verfügen über native FS-Unterstützung durch XHCI (USB 3.0) -Hostcontroller, sodass die direkte Verbindung vom XHCI-Treiber übernommen wird. Ältere Computer verfügen über die FS-Unterstützung in ihrer Hardware und über Multiplex-Ports zu älteren OHCI- oder UHCI-Controllern, sodass sie auch die FS-Datenrate direkt unterstützen.

Wenn sich jedoch ein Hub dazwischen befindet, muss der FS-Verkehr mit der Split-Transaction-Technik abgewickelt werden, die ausschließlich auf Software basiert. Die Split-Regeln sind fürchterlich kompliziert und werden von ungefähr 150 Seiten USB-Spezifikationen abgedeckt. Wenn Ihr Robotertreiber nur unzureichende (oder keine) Unterstützung für aufgeteilte Transaktionen bietet, funktionieren FS- und LS-Geräte hinter einem Hub nicht, insbesondere wenn viele dieser Geräte vorhanden sind.

Zusatz: Orico Hub verwendet den VL812-Controller-IC, der nur einen TT im HS-Pfad hat. Mit einem (vermutlich FS) 422-USB-Gerät, das für 500.000 Bauds und andere FS-Geräte konfiguriert ist, ist wahrscheinlich keine Bandbreite mehr verfügbar, und der Host hat Probleme mit der Transaktionsplanung und Barfs auf etwas.