Laden...

Mit Mono und Linux ein USB-Gerät erkennen

Letzter Beitrag vor 7 Jahren 6 Posts 2.275 Views
Mit Mono und Linux ein USB-Gerät erkennen

Hallo 🙂
Ich will mit einen Programm erkennen, wenn ein bestimmtes Usb-Gerät eingesteckt wurde.
Meine erste Idee war die LibUsbDotNet: Damit funktioniert die abfrage, aber ich bekomme nicht den jeweiligen Portnamen angezeigt, an dem das Gerät steckt.
Habt ihr noch Anregungen wie ich das vielleicht realisieren könnte?


UsbRegDeviceList allDevices = UsbDevice.AllDevices;

			foreach (UsbRegistry usbRegistry  in allDevices) {
				if (usbRegistry.Vid == 1133 && usbRegistry.Pid == 3139) {	
					Console.WriteLine ("gefunden");

				}

Hi,

was meinst du denn mit dem Portnamen?

Ist dein USB-Gerät, welches später als COM-Port auftritt?

Falls dem so ist - würde ich über SerialPort.GetPortNames gehen.

Zudem gab es auch über ähnliche Wege sogar mitzubekommen, wenn ein neuer SerialPort dazugekommen ist etc.

LG

Genau. Ich möchte dann erkennen, ob ein Arduino eingesteckt worden ist und wie der Serielle Port heißt. Also ttyACMx.

Das Problem ist die Verknüpfung zwischen der LibUSB und dem SerialPort Namen.


var serialport = SerialPort.GetPortNames() ;

So bekomme ich alle verwendeten SerialPorts.
Mit meinem ersten Ansatz weiß ich nur, das einer der SerialPorts ein Ardunio ist. Ich weiß aber nicht welcher das ist.
Kann ich diese Liste noch mal mit der VendorID durchsuchen?

Hi,

ich fürchte da wirst du dann selbst die Registry durchsuchen müssen. Vll hilft dir folgender Thread - da steht zumindest drin, wo die Klasse SerialPort Ihre Infos her nimmt - das wirst du dann mit den Ergebnissen von Libusb abgleichen müssen - falls das so möglich ist.

Der Thread: How do I get serial Port device id?

LG

Hey,
unter Linux kannst du per udev rule, ein bestimmtes USB Gerät (indem Fall ein bestimmter virtueller Comport) auf einen bestimmten Gerätenamen unter /dev mappen.

Writing udev rules

Eine einfache Beispielrule:


SUBSYSTEM=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2424", GROUP="deine benutzer gruppe", SYMLINK="dein linkname für /dev"

Die Vendorid und Productid kannst du mit lsusb -v herausfinden. Die sollte für den Arduino eindeutig sein.

PS. du könntest das auch mit libusb machen. Da musst du nur auf die vendor bzw. product id abprüfen und dann direkt per usb Transfers in den virtuellen Comport reinschreiben 😉

PS. du könntest das auch mit libusb machen. Da musst du nur auf die vendor bzw. product id abprüfen und dann direkt per usb Transfers in den virtuellen Comport reinschreiben 😉

Hey, danke!

Ich habe mir das mit dem Querverweis nochmal angeschaut, und kam dann auf eine Lösung.


UsbRegDeviceList allDevices = UsbDevice.AllDevices;
   foreach (UsbRegistry usbRegistry  in allDevices) {
       if (usbRegistry.Vid == 1133 && usbRegistry.Pid == 3139) {
               Console.WriteLine ("gefunden");
               var name = new SerialPort();
               Console.WriteLine(name.PortName);
                }

Jetzt schaue ich mir das nochmal mit den udev-rules an, vllt geht es damit eleganter. Aber für das erste reicht das erstmal.
8)