Seite 1 von 1

Nach einem USB-Gerät schauen ob es online ist.

Verfasst: Dienstag 12. Mai 2026, 18:41
von kiaralle
Hallo,
ich möchte nach einem bekannten USB-Gerät schauen ob es online ist und dann per /dev/ttyUSBxxx einbinden.
Es ist also Linux.

Meine Code sieht aktuell so aus.

Code: Alles auswählen

import usb.core
usbdevice = usb.core.find(idVendor=0x0403, idProduct=0x6001)


if usbdevice is None:
    print ('Device not found')
else:
   print ("Gerät online")
   print(dev.parent)
Ich erkenne aktuell das mein Gerät off oder online ist.
Wie erkenne ich welche Schnittstelle zu verwenden ist, oder wie greife ich darauf zu. muss ich eigentlich immer /dev/ttyUSBxxx verwenden oder gibt es andere Wege?


dev.parent zeigt mir folgendes


DEVICE ID 1d6b:0002 on Bus 003 Address 001 =================
bLength : 0x12 (18 bytes)
bDescriptorType : 0x1 Device
bcdUSB : 0x200 USB 2.0
bDeviceClass : 0x9 Hub
bDeviceSubClass : 0x0
bDeviceProtocol : 0x1
bMaxPacketSize0 : 0x40 (64 bytes)
idVendor : 0x1d6b
idProduct : 0x0002
bcdDevice : 0x617 Device 6.17
iManufacturer : 0x3 Error Accessing String
iProduct : 0x2 Error Accessing String
iSerialNumber : 0x1 Error Accessing String
bNumConfigurations : 0x1
CONFIGURATION 1: 0 mA ====================================
bLength : 0x9 (9 bytes)
bDescriptorType : 0x2 Configuration
wTotalLength : 0x19 (25 bytes)
bNumInterfaces : 0x1
bConfigurationValue : 0x1
iConfiguration : 0x0
bmAttributes : 0xe0 Self Powered, Remote Wakeup
bMaxPower : 0x0 (0 mA)
INTERFACE 0: Hub =======================================
bLength : 0x9 (9 bytes)
bDescriptorType : 0x4 Interface
bInterfaceNumber : 0x0
bAlternateSetting : 0x0
bNumEndpoints : 0x1
bInterfaceClass : 0x9 Hub
bInterfaceSubClass : 0x0
bInterfaceProtocol : 0x0
iInterface : 0x0
ENDPOINT 0x81: Interrupt IN ==========================
bLength : 0x7 (7 bytes)
bDescriptorType : 0x5 Endpoint
bEndpointAddress : 0x81 IN
bmAttributes : 0x3 Interrupt
wMaxPacketSize : 0x4 (4 bytes)
bInterval : 0xc


Gruß Ralf

Re: Nach einem USB-Gerät schauen ob es online ist.

Verfasst: Dienstag 12. Mai 2026, 18:46
von kiaralle
Noch eine Frage.
Ich stelle in eine anderen Programm fest, das nach dem abziehen und wieder einstecken das USB-Steckers die Schnittstelle vom System geändert
wird.
Aus /dev/ttyUSB0 wird dann ttyUSB1.
Das ist natürlich blöde wenn im Code ttyUSB0 steht :-)
Könnte es mit einer unsauberen Programmierung zusammen hängen? Der Port ist noch offen und nicht freigegeben und das System weicht aus?

Re: Nach einem USB-Gerät schauen ob es online ist.

Verfasst: Dienstag 12. Mai 2026, 20:22
von sparrow
Verstehe ich nicht.
Was ist denn "dev" in deinem Code? Das wird dort nirgends definiert.
und wo greifst du denn auf /dev/ttyXXXX zu?

Re: Nach einem USB-Gerät schauen ob es online ist.

Verfasst: Dienstag 12. Mai 2026, 22:31
von imonbln
Sich auf /dev/ttyUSBxxx zu verlassen, ist leider sehr wackelig. systemd/udev iteriert die Devices einfach durch, je nachdem, in welcher Reihenfolge sie erkannt werden. Es gäbe noch /dev/serial/by-path (hier wird das Gerät über den Port angesprochen, was sich aber auch ändern kann) oder /dev/serial/by-id.

Auf der Systemebene kannst du außerdem eine udev-Regel anlegen, welche dem Adapter immer denselben Namen gibt, z. B. /dev/ttyUSBMyDevice. Normalerweise nimmt man dafür gerne eindeutige Attribute aus dem Pool:
idVendor, idProduct, serial, manufacturer oder product.

Könnte bei dir allerdings etwas schwierig werden, weil serial, manufacturer und product scheinbar nicht gesetzt sind. Dennoch würde ich, wenn mein Ziel die sinnvolle Identifizierung des Geräts wäre, immer über eine udev-Regel gehen.

Du solltest dir aber auch überlegen: Musst du das Gerät zwingend automatisch identifizieren oder kannst du das nicht an den Benutzer delegieren? Dieser könnte dann einfach beim Programmaufruf die Schnittstelle (Device Path) als Parameter übergeben.

Re: Nach einem USB-Gerät schauen ob es online ist.

Verfasst: Dienstag 12. Mai 2026, 22:43
von __blackjack__
@kiaralle: Wenn man ein bestimmtes USB-Gerät immer unter dem gleichen Namen erreichen will, macht man das unter Linux in der Regel über eine udev-Regel. Damit kann man einen Symlink anlegen lassen wenn das Gerät erkannt wird, der auf welchen Namen auch immer zeigt, den der Kernel ausgewählt hat.

@imonbln: Ich bin ziemlich sicher die Werte sind gesetzt aber das Programm wurde als normaler Benutzer ausgeführt, und der hat nicht die Rechte diese Infos abzufragen. Beispiel mit einem FTDI-Chip den ich hier rumliegen habe als normaler Benutzer:

Code: Alles auswählen

DEVICE ID 0403:6015 on Bus 001 Address 054 =================
 bLength                :   0x12 (18 bytes)
 bDescriptorType        :    0x1 Device
 bcdUSB                 :  0x200 USB 2.0
 bDeviceClass           :    0x0 Specified at interface
 bDeviceSubClass        :    0x0
 bDeviceProtocol        :    0x0
 bMaxPacketSize0        :    0x8 (8 bytes)
 idVendor               : 0x0403
 idProduct              : 0x6015
 bcdDevice              : 0x1000 Device 16.0
 iManufacturer          :    0x1 Error Accessing String
 iProduct               :    0x2 Error Accessing String
 iSerialNumber          :    0x3 Error Accessing String
 bNumConfigurations     :    0x1
…
Und das gleiche als root:

Code: Alles auswählen

DEVICE ID 0403:6015 on Bus 001 Address 054 =================
 bLength                :   0x12 (18 bytes)
 bDescriptorType        :    0x1 Device
 bcdUSB                 :  0x200 USB 2.0
 bDeviceClass           :    0x0 Specified at interface
 bDeviceSubClass        :    0x0
 bDeviceProtocol        :    0x0
 bMaxPacketSize0        :    0x8 (8 bytes)
 idVendor               : 0x0403
 idProduct              : 0x6015
 bcdDevice              : 0x1000 Device 16.0
 iManufacturer          :    0x1 FTDI
 iProduct               :    0x2 FT231X USB UART
 iSerialNumber          :    0x3 DR00775F
 bNumConfigurations     :    0x1
…

Re: Nach einem USB-Gerät schauen ob es online ist.

Verfasst: Mittwoch 13. Mai 2026, 04:51
von Pedroski55
Warum mache es einfach, wenn kompliziert auch geht?

Weiß nicht was für Linux du da hast. Hab gehört, alte Debiansysteme waren so sicher, sie waren für Herr Normalverbraucher unbrauchbar.

Die Tage sind vorbei.

In Ubuntu, ein Usbspeicher wird unter dem Labelname in /media/username/Labelname gefunden

In meinem Fall, mein Lenovastick heißt X3 und wird immer in /media/peterr/X3 gemountet.
Es macht nicht ob der Stick in /dev/sda1, dev/sdb1 oder sonst was unter /dev gemeldet ist, es taucht immer unter /media/peterr/X3

Drum, man suche den Stick unter dem Labelname, vergiß /dev

Code: Alles auswählen

from pathlib import Path

path2usb = Path('/media/peterr/X3')

if path2usb.is_dir():
    print(f'Der Usbsstick {path2usb} steckt.')
else:
    print(f'Der Usbsstick {path2usb} steckt nicht.')
Weiß nicht was Du für alte ausrangierte Usbsticks das hast!
Not real familiar with usb.core but as far as I know it is used to communicate with USB devices that do not have a driver and would use the vendor ID and device number versus device id.
Moral der Geschichte: kauf dir einen neuen Stick!

Re: Nach einem USB-Gerät schauen ob es online ist.

Verfasst: Mittwoch 13. Mai 2026, 05:54
von sparrow
@Pedroski55: Ich habe gehört, früher gab es ganz viele verschiedene Arten von Steckern um Peripherie an Computer zu verbinden. Die Tage sind vorbei! Moral der Geschichte: Nicht jedes Gerät ist ein USB Stick.

@kiaralle: Weil es hier schon viel. Wenn dein Programm Linux als Zielplattform hast, könntest du dir auch pyudev anschauen.
Mich würde trotzdem interessieren, wie du auf das Device zugreifst.

Re: Nach einem USB-Gerät schauen ob es online ist.

Verfasst: Mittwoch 13. Mai 2026, 06:30
von imonbln
@__blackjack__ Schön, wenn man als root mehr sieht, aber gerade bei USB-to-Serial gibt es eine Menge superbillig produzierter Geräte, bei denen nicht jedes Device eine eigene Seriennummer hat oder bei denen sogar ein gefälschter FTDI zum Einsatz kommt, leider beides schon selbst erlebt.

@Pedroski55 Du verwechselst Implikation und Äquivalenz: Jeder USB-Stick ist ein USB-Gerät, aber nicht jedes USB-Gerät ist ein USB-Stick. Der TO arbeitet mit USB-to-Serial-Geräten; laut Vendor- & Product-ID mit denen von FTDI. Und die melden sich leider erst mal nur als /dev/ttyUSBXXX an, so wie jeder USB-to-Serial-Konverter. Daher muss er irgendwelche Klimmzüge machen, um sein Gerät eindeutig identifizieren zu können, zum Beispiel Udev-Regeln erstellen

Re: Nach einem USB-Gerät schauen ob es online ist.

Verfasst: Mittwoch 13. Mai 2026, 10:26
von DeaD_EyE
Eine Möglichkeit wäre die Nutzung von pyudev, wenn man z.B. UDEV-Regeln nicht anpassen will/kann.

Code: Alles auswählen

from enum import StrEnum, auto
from pyudev import Context, Monitor


class Action(StrEnum):
    add = auto()
    remove = auto()


def enumerate_tty():
    context = Context()
    monitor = Monitor.from_netlink(context)

    for device in iter(monitor.poll, None):
        if device.action in Action:
            if device.device_node is not None and "tty" in device.device_node:
                yield Action(device.action), device.device_node

if __name__ == "__main__":
    for action, dev_path in enumerate_tty():
        if action is Action.add:
            print("Added device:", dev_path)
        if action is Action.remove:
            print("Removed device:", dev_path)

Re: Nach einem USB-Gerät schauen ob es online ist.

Verfasst: Mittwoch 13. Mai 2026, 11:13
von __blackjack__
Alternativ könnte man das auch als Generatorausdruck schreiben:

Code: Alles auswählen

#!/usr/bin/env python3
from enum import auto, StrEnum

from pyudev import Context, Monitor


class Action(StrEnum):
    add = auto()
    remove = auto()


def iter_tty_actions():
    return (
        (Action(device.action), device.device_node)
        for device in iter(Monitor.from_netlink(Context()).poll, None)
        if device.action in Action
        and device.device_node is not None
        and "tty" in device.device_node
    )


def main():
    for action, device_filename in iter_tty_actions():
        print(f"{action.name.title()}ed: {device_filename}")


if __name__ == "__main__":
    main()