Adresierung USB-Hubs und Ports

OP #8086392
Lesenswert?

Hallo,

ich habe manchmal Übertragungsprobleme mit einem RS485-USB-Stick. Bisher habe ich den Raspi aus- und eingeschaltet. ich möchte das etwas automatisieren.

Dazu habe ich das Programm uhubctl gefunden. Dies gibt als Hubs dies aus:

1
Current status for hub 2-1 [2109:8110 VIA Labs, Inc. USB3.0 Hub, USB 3.00, 4 ports, ppps]
2
Current status for hub 2 [1d6b:0003 Linux 6.18.34+rpt-rpi-v8 xhci-hcd xHCI Host Controller 0000:01:00.0, USB 3.00, 4 ports, ppps]
3
Current status for hub 1-1.1 [2109:2811 VIA Labs, Inc. USB2.0 Hub, USB 2.10, 4 ports, ppps]
4
  Port 4: 0103 power enable connect [067b:2303 Prolific Technology Inc. USB-Serial Controller D]
5
Current status for hub 1-1 [2109:3431 USB2.0 Hub, USB 2.10, 4 ports, ppps]
6
Current status for hub 1 [1d6b:0002 Linux 6.18.34+rpt-rpi-v8 xhci-hcd xHCI Host Controller 0000:01:00.0, USB 2.00, 1 ports, ppps]

die anderen Ports habe ich gelöscht.

Im Programm spreche ich den Stick mit diesem Pfad an:

1
/dev/serial/by-path/platform-fd500000.pcie-pci-0000:01:00.0-usb-0:1.1.4:1.0-port0

Wie komme ich jetzt von diesem Pfad auf den Hub 1-1.1, welches ich beim Abschalten ("uhubctl -a off -l 1-1.1 -p 4") angebe? Nach -usb- kommen nur zwei Einsen vor. Ist die erste Zahl nach -usb- noch um eins zu erhöhen?

Hardy

#8086431
Lesenswert?

Hardy F. schrieb:

ich habe manchmal Übertragungsprobleme mit einem RS485-USB-Stick.

Bevor ich so ein Problem mit aus- und wieder einschalten, egal wie automatisiert, anfange zu umschiffen, würde ich erst mal schauen ob man da nicht besser an der Wurzel ansetzen kann.

Wie äußern sich die Probleme genau?

Ist die Übertragung auf USB-Ebene gestört oder auf RS485-Ebene? Oder ist das noch nicht so ganz eindeutig?

Was siehst Du im Moment der Probleme im syslog/messages/systemd-journal?

#8086455
Lesenswert?

Gerd E. schrieb:

Hardy F. schrieb:

ich habe manchmal Übertragungsprobleme mit einem RS485-USB-Stick.

Bevor ich so ein Problem mit aus- und wieder einschalten, egal wie automatisiert, anfange zu umschiffen, würde ich erst mal schauen ob man da nicht besser an der Wurzel ansetzen kann. ...

Mit der Fehlersuche kann man viel Zeit verbringen, ohne am Ende schlauer zu sein.

Es würde ja evtl. schon reichen, den zugehörigen Treiber einmal zu entladen, etwas zu warten, und dann den Treiber wieder neu zu laden. Bei einem Linux sollte das ein rmmod/insmod bewerkstelligen. Beim Windows tut es ein devcon restart...

Hier treten solche Probleme ganz typisch dann auf, wenn eine Applikation "A" das Gerät benutzt hat, beendet wird, und anschliessend sofort von Applikation "B" benutzt werden soll.

Es kann sicher auch nicht schaden, mal einen anderen USB-Hub zu probieren, oder direkt an den Root-Hub anzuschliessen.

#8086601
Lesenswert?

Ein Pi4 oder Pi5 hat mehr als genug echte UARTs. Die darf man auch benutzen und hat damit in einem Schritt auch USB als Fehlerquelle komplett eliminiert. Idealerweise nimmt man dafür nicht UART0 (GPIO14/15) und auch nicht den Mini-UART UART1 beim Pi4, sondern einen der anderen UARTs.

fchk

OP #8086717
Lesenswert?

Gerd E. schrieb:

Wie äußern sich die Probleme genau? Ist die Übertragung auf USB-Ebene gestört oder auf RS485-Ebene? Oder ist das noch nicht so ganz eindeutig?

Bei der betroffenen Leitung geht es um die Abfrage der Akkus von Pylontech, es sind 4 Stück, alle mit eigener Adresse die nacheinander abgefragt werden. Immer mal wieder liefert ein Akku keine Daten, und manchmal auch alle 4 nicht. Dann hilft der Neustart des USB-Sticks.

Was siehst Du im Moment der Probleme im syslog/messages/systemd-journal?

Keine Daten im Log, es kommt einfach keine Antwort auf die Abfrage.

Cartman E. schrieb:

Es würde ja evtl. schon reichen, den zugehörigen Treiber einmal zu entladen, etwas zu warten, und dann den Treiber wieder neu zu laden.

Das geht nicht, es sind viele USB-Sticks mit dem selben Treiber angebunden.

Es kann sicher auch nicht schaden, mal einen anderen USB-Hub zu probieren, oder direkt an den Root-Hub anzuschliessen.

Der Raspi ist über einen USB-Isolator mit den Hub Verbunden, die Raspis sind mir z.Z. zu teuer um den ersetzen zu müssen.

Frank K. schrieb:

Ein Pi4 oder Pi5 hat mehr als genug echte UARTs. Die darf man auch benutzen und hat damit in einem Schritt auch USB als Fehlerquelle

Bei dem Preis der RS485-USB-Sticks baue ich keine RS485-Wandler mehr selbst. Außerdem brauche ich einige (insgesamt 6) isolierte RS485/RS232-Anbindungen. Jedes Gerät hat ein anderes Protokoll oder andere Geschwindigkeit.

Hardy

#8086742
Lesenswert?

Frank K. schrieb:

Ein Pi4 oder Pi5 hat mehr als genug echte UARTs. Die darf man auch benutzen

Aber welche davon kann einen RS485-Treiber ansteuern? Willst Du das etwa in Software mit einer GPIO-Leitung machen?

Im Raspberry Pi gibt es UARTs vom Typ PL011, die sind 16550-kompatibel. Und die haben keine Hardwareunterstützung, um RS48-Treiber anzusteuern (Sender-/Empfängerumschaltung)

Vernünftige UARTs können das in Hardware, und zu den vernünftigen UARTs gehört die im FT232.

Der Threadstarter könnte versuchen, statt den USB-Hub zurückzusetzen, nur den (namenlosen) USB-RS485-Adapter zurückzusetzen - das geht genauso mit usbctl.

#8086754
Lesenswert?

Harald K. schrieb:

Frank K. schrieb:

Ein Pi4 oder Pi5 hat mehr als genug echte UARTs. Die darf man auch benutzen

Aber welche davon kann einen RS485-Treiber ansteuern? Willst Du das etwa in Software mit einer GPIO-Leitung machen? Im Raspberry Pi gibt es UARTs vom Typ PL011, die sind 16550-kompatibel. Und die haben keine Hardwareunterstützung, um RS48-Treiber anzusteuern (Sender-/Empfängerumschaltung)

Lies https://github.com/raspberrypi/firmware/blob/master/boot/overlays/README

1
Name:   uart2
2
Info:   Enable uart 2 on GPIOs 0-3. BCM2711 only.
3
Load:   dtoverlay=uart2,<param>
4
Params: ctsrts                  Enable CTS/RTS on GPIOs 2-3 (default off)
5
        rs485                   Enable RS485 mode for using the RTS line to
6
                                drive the OE pin of an RS485 transceiver (i.e.
7
                                MAX3078E); also enables the UARTx ctsrts
8
                                parameter, as RTS is required (default off).
9
        rs485_full_duplex       When RS485 mode is enabled, enables receiving of
10
                                data while sending data (default off)
11
        rs485_invert_rts        When RS485 mode is enabled, inverts the RTS
12
                                line from active-high (default) to active-low.
13
        rs485_rts_on_delay      When RS485 mode is enabled, sets the delay (in
14
                                milliseconds) between data transmission starting
15
                                and the RTS line being asserted (default 0).
16
        rs485_rts_off_delay     When RS485 mode is enabled, sets the delay (in
17
                                milliseconds) between data transmission ending
18
                                and the RTS line being deasserted (default 0).

Vernünftige UARTs können das in Hardware, und zu den vernünftigen UARTs gehört die im FT232.

Ja, da hat Broadcom sich einfach nur im Arm-Katalog bedient.

fchk

#8086759
Lesenswert?

Hardy F. schrieb:

Der Raspi ist über einen USB-Isolator mit den Hub Verbunden, die Raspis sind mir z.Z. zu teuer um den ersetzen zu müssen. Frank K. schrieb:

Ein Pi4 oder Pi5 hat mehr als genug echte UARTs. Die darf man auch benutzen und hat damit in einem Schritt auch USB als Fehlerquelle

Bei dem Preis der RS485-USB-Sticks baue ich keine RS485-Wandler mehr selbst. Außerdem brauche ich einige (insgesamt 6) isolierte RS485/RS232-Anbindungen. Jedes Gerät hat ein anderes Protokoll oder andere Geschwindigkeit.

Heißt also: die einzelnen Busse sind untereinander nicht potentialgetrennt. Das ist unklug und könnte Ursache des Problems sein. Besser wäre es, die Isolation zwischen UART und Transceiver zu setzen oder gleich einen isolierten Transceiver wie den ADM2861E zu verwenden. https://www.analog.com/en/products/ADM2861E.html

Im übrigen hoffe ich, dass Du nicht nur das differentielle Adernpaar, sondern auch GND durchverbunden hast.

Hast Du auch Failsafe-Widerstände an deinen Bussen?

Einfach nur den USB-Adaper zu resetten ist Pfusch. Wenn das ganze regelmäßig aussteigt, ist da was faul, und Du solltest die Ursache beheben. Das kann auch heißen, dass Du zu billig gekauft hast und Deine USB-RS485-Adapter Mist sind ("waren ja günstig"), oder dass die Verdrahtung nicht regelkonform ist.

fchk

#8086773
Lesenswert?

Hardy F. schrieb:

Immer mal wieder liefert ein Akku keine Daten, und manchmal auch alle 4 nicht. Dann hilft der Neustart des USB-Sticks.

Da ist etwas faul mit der Hardware und der Neustart ist nur ein schlechter Workaround.

2 Punkte könnte ich mir vorstellen:

  • gefälschte USB-UART-Wandler. Die Prolific PL2303 sind berüchtigt dafür dass es fast nur Fälschungen auf dem Markt gibt. Prolific hat dann irgendwann den Windows-Treiber für alle alten Modelle geblockt, sowohl Fälschungen als auch echte. Ich habs nicht mehr 100% im Kopf, aber ich glaube die PID 0x2303 waren die alten mit den vielen Fälschungen und die neuen sind 0x23A3. Unter Linux hast Du natürlich kein Problem mit den Treibern. Aber die Fälschungen machen dennoch gerne Ärger durch Aussetzer und Übertragungsprobleme.

  • Common-Mode-Probleme zwischen den einzelnen Adaptern. Du hast wie ich das verstehe eine galvanische Isolation zwischen Raspi und vielen Bus-Adaptern. Aber eben keine Isolation zwischen den Bussen untereinander. Und da kann es abhängig von der Anwendung und Verkabelung durchaus auch mal etwas "rumpeln" und dann stürzt ein Adapter in Folge ab. Das kann dann durchaus ein Vorbote von "brennt durch" sein, daher würde ich wenn das öfters passiert das Thema ernst nehmen und das sauber lösen.

Probier doch mal einen der Adapter neu zu kaufen in gesicherter Qualität ohne Gefahr von Fälschungen. Dann schauen ob der noch abstürzt. Wenn weiterhin, dann bei diesem einen einen separaten Isolator davor. Treten dann noch Probleme auf? Wenn nein, dann diese Lösung überall ausrollen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren