Как найти com1 порты на windows 7

Обнаружение отключения/подключения конвертера USB/COM — .NET — Форум — Programujte.com

Форум › .NET

Обнаружение отключения/подключения преобразователя USB/COM

для одной службы Windows мне нужно обнаружить удаление и подключение USB-устройства, которое работает как виртуальный COM. После поиска я наткнулся на код, который распознает подключение/отключение любого USB-устройства. Что меня удивляет, так это то, что обработчик события вызывается 6x для простых устройств и 7x для устройств с 2 COM. При первом вызове обработчика watcher_EventInsert «моего» COM нет в списке, после следующих (5 или 6) вызовов он есть.

Как добиться, чтобы каждое событие вызывалось 1x и при его обработке выяснялось, связано ли оно с «моим» COM? Или это нужно делать по-другому?

#1 глухой
я не знаю, почему он делает это с вами 6 раз, но решение есть в Интернете, так что попробуйте другое решение, но в худшем случае вам придется запрограммируйте его на С++ объектно, а затем создайте управляемую оболочку на С++/CLI 🙂

да, даже при обнаружении устройства ищется все дерево USB устройств, так что если у вас подключено несколько устройств, то выведет список всех, т.е. 6

#2 Джерри
решение — полноценный интернет

многие из них вообще не работают.

запрограммировать объектно-ориентированную программу на C++, а затем создать управляемую оболочку на C++/CLI 🙂

ты желаешь мне счастья 🙂

да, даже при обнаружении устройства ищется все дерево USB устройств, так что если у вас подключено несколько устройств, то выведет их все, т.е. 6

Я попробовал это с большим количеством устройств, количество вызовов обработчика событий увеличивалось с количеством устройств. 5 частей, вероятно, будут внутри компьютера (корневой концентратор . ).

Читайте также:  Как открыть компьютер для сети windows 10

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

#3 глухой

здесь должна быть работающая версия обнаружения вставки/извлечения USB-устройства с использованием родного WinAPI32

https://social.msdn.microsoft.com/Forums/vstudio/en-US/cc2ff1a4-e0c6-4a45-b03e-d84abb15d6f6/detecting-the-insertion-and-removal-of-a- USB-накопитель?forum=vcgeneral

если у вас сработает, то переписать пример в объекты, например в MS VS 2017 C++ Win32 и написать для него управляемую обертку на C++/CLI и соответственно с возможностью использования в C# уже не большая работа.

кроме того, всю сборку можно оставить работающей как службу Windows — в идеале без окна

#1 глухой
я попробовал это

но, например, под VMWare мне не удалось обнаружить его с правильным VID только с VID родительского хоста.

#5 Джерри
Вы пробовали это как часть службы Windows? Есть разница между воком и сервизом.

Копаясь в очередной куче навоза, я наткнулся на https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-registerdevicenotificationa. Там объясняется, как зарегистрироваться в службе. Так что, если регистрация для wokno «зашита» в какой-то библиотеке (похоже, что так и есть), то для сервиса она работать не будет.

#6 глухой
теперь я попробовал его как сервис пример и у меня он тоже работает как сервис

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

#1 глухой
если вы хотите написать сервис, вот инструкция

Меня интересуют только два события: «COM x se»подключен» и «COM x отключен». Требовать для этой цели VID и PID преобразователя USB/COM — нонсенс. Выкапывать его — это в основном писать собственное ПО (это сложнее сделать).

Читайте также:  Как сделать чтобы отображались форматы файлов windows 10

Большинство рабочих решений используют ManagementEventWatcher и WqlEventQuery с небольшими различиями в настройках. Событие всегда вызывается несколько раз. Я безуспешно пытался найти параметр WqlEventQuery специально для виртуального COM.

Для кода из поста №1 просто отфильтруйте изменение состояния порта — использование «есть/нет в списке» и «был/не был в списке» похоже на путь наименьшего сопротивления (= вполне выполнимый ) мне.

#8 Jerry
как написать сервис на C# — классы готовятся во фреймворке и процедуры можно найти прямо на C#, нет необходимости решать всякие гаечные ключи с оберткой. Для облегчения работы у меня есть пример проекта, а все остальное я делаю «за один раз».

#10 deaf
а вы не думали как-то использовать параметр «e»?

#11 Джерри
подумал, но его содержимое не несет информации об устройстве, на котором произошло изменение.

#12 deaf
ну, я бы решил вашу проблему, создав простой WindowsService, который будет работать все время и обнаруживать подключение и отключение различных устройств к USB-диску 1x в секунду. Вот пример службы Windows, и он отлично работает:

Ну, эта служба будет передавать информацию о типе (VID/PID и другие) устройства, к которому она была подключена и отключена, в вашу запущенную программу. Потому что суть в том, что если устройство будет отключено, вы ничего об этом не узнаете. Информация больше недоступна. попробуй все обдумать. это просто и это работает

#13 Джерри
ну, я бы сказал, что это работает хорошо. как услуга

и вот пример того, какобнаружить вставку/извлечение диска.

тоже хорошо работает .

Ну, так что все, что вам нужно, это создать службу.. запустить ее, а затем просто ждать сообщения от службы в вашей программе.

Читайте также:  Как поставить виджет календарь на рабочий стол windows 10

#14 Джерри
https://www.silabs.com/community/interface/knowledge-base.entry.html/2013/11/21/obtaining_devicenot-0ULM

Отдельный сервис будет отправлять информацию сервису, значит иметь какую-то форму IPC — это значит еще больше усложнить проблему. Информация о типе VID, PID. не имеют значения, не имеет значения, использует ли мой виртуальный COM в качестве HW FT232, FT2232, CH40 или какой-либо Atmel с оригинальным Arduino. Мой сервис должен иметь информацию об удалении COM, чтобы корректно завершить работу с COM без сбоев, и ему нужно иметь информацию о «возвращении» COM, чтобы восстановить соединение с периферией.

Назначение выглядит так: каждый сервис (их может быть несколько на одном компьютере) следит за своим устройством, прерывает связь, если устройство удаляется (а также может записывать его в БД) и возобновляет связь, когда устройство отключается. повторно подключен (он также может войти в БД). Это означает:

1. При запуске сервис должен знать обозначение COM, его настройки (скорость передачи и т.д.). Это прописано в конфигурации сервиса.

2. Во время выполнения служба должна (среди прочего) обнаруживать и реагировать на события удаления и повторного подключения COM.

Пункт 2 — обнаружение событий послужил причиной создания этой ветки. Можно использовать WMI, как я сразу указал в #1, но событие должно быть отфильтровано, потому что событие идет на каждое USB-устройство, а не только на виртуальный COM. Можно использовать функцию RegisterDeviceNotification, но это означает либо смешивание кода C/C++ с C# со всеми вытекающими отсюда проблемами, либо написание всего сервиса на C/C++, что требует много дополнительной работы по сравнению с C#, плюс у него будет бытьспособ фильтрации только событий для определенного COM.

Я ожидал простого элегантного решения, лучшего способа, чем тот, который я рассматриваю до сих пор. Наиболее подходящий полуфабрикат. Пока кажется, что лучшего способа нет.

Поделиться с друзьями
ОС советы