Как получить имя последовательного порта Arduino

Я пытаюсь выяснить, какой последовательный порт принадлежит Arduino,
Так как SerialPort класс не раскрывает никакой информации о
базовое оборудование, я пытаюсь использовать LibUsbDotNet вместо этого.

Используя следующий код, вы получите список всех устройств:

UsbDevice.ForceLibUsbWinBack = true;
var devices = UsbDevice.AllDevices;

Затем я могу либо перебрать их все, либо найти Arduino в частности:

var deviceFinder = new UsbDeviceFinder(0x2341, 0x8036);
var arduino = devices.Find(deviceFinder);

Это на самом деле работает, и я получаю экземпляр UsbRegistry,
но я не могу открыть устройство или определить, через какой последовательный порт оно выставлено.

USBDevice arduinoUsbDevice;
usbRegistry.Open(out arduinoUsbDevice);

Так как это не работает arduinoUsbDevice остатки null,

Затем я попытался с помощью DeviceNotifier класс, который вызывает событие всякий раз, когда
устройство добавлено или удалено из системы:

var notifier = DeviceNotifier.OpenDeviceNotifier();

notifier.OnDeviceNotify += (s, e) =>
{
    WriteLine(e.Device?.Name ?? "no device");
    WriteLine(e.Device?.IdProduct ?? 0);
    WriteLine(e.Device?.IdVendor ?? 0);
    WriteLine(e.EventType);
    WriteLine(e.Object);
    WriteLine(e.Port?.Name ?? "");
};

Теперь, когда я подключаю Arduino на компьютер, событие возникает дважды.
Как будто два отдельных устройства подключены,
но только один из них когда-либо возвращается UsbDevice.AllDevices:

` \\?\USB#VID_2341&PID_8036#7&533912d&0&2#{a5dcbf10-6530-11d2-901f-00c04fb951ed}
32822
9025
DeviceArrival
FullName:USB#VID_2341&PID_8036#7&533912d&0&2#{a5dcbf10-6530-11d2-901f-00c04fb951ed}
Vid:0x2341
Pid:0x8036
SerialNumber:7&533912d&0&2
ClassGuid:a5dcbf10-6530-11d2-901f-00c04fb951ed


no device
0
0
DeviceArrival
[Port Name:COM5] 
COM5

Впервые событие возникает для устройства, которое мы могли найти и раньше.
Второй раз он поднимается с e.Device установлен в null но
с e.Port установлен в COM5, которая является информацией, которую я ищу.

Так что проблема в том, что я могу получить эту информацию только тогда, когда Arduino подключен
после того, как программное обеспечение было запущено, и даже тогда связывание двух событий
своего рода игра в догадки.

Есть ли способ получить информацию, не полагаясь на
на событиях, поднятых DeviceNotifier учебный класс?

Я знаю, что мог бы использовать System.Management а также WMI запросы, но они не доступны в Linux и MacOS, поэтому я использую LibUsbDotNet вместо.

Я использую нативную библиотеку libusb-1.0

0 ответов

Другие вопросы по тегам