реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Как определить имена существующих ком портов
sergey sva
сообщение Mar 1 2010, 14:39
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Как определить имена существующих ком портов, на vs ?
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Mar 1 2010, 17:36
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Прочитать соответсвующее поле реестра.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
msalov
сообщение Mar 2 2010, 07:38
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Цитата(DpInRock @ Mar 1 2010, 19:36) *
Прочитать соответсвующее поле реестра.

А точнее "HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM"
Go to the top of the page
 
+Quote Post
V_G
сообщение Mar 2 2010, 08:50
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



В цикле поочередно пытаюсь открыть все возможные компорты (CreateFile) из списка, полученного из вышеупомянутого поля реестра. Если возвращается INVALID_HANDLE_VALUE, порт недоступен. Если открытие прошло успешно, добавляю № порта в список доступных и закрываю порт.
В результате имею список доступных на данный момент портов.
Go to the top of the page
 
+Quote Post
Yaumen
сообщение Mar 2 2010, 13:57
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 187
Регистрация: 22-06-05
Из: Минск, Беларусь
Пользователь №: 6 213



Если лень разбираться, то существует множество классов для перечисления доступных портов.

Например, вот здесь:
http://naughter.com/enumser.html
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Mar 2 2010, 17:19
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Да проще будет использовать готовый класс.
Код
array<String^>^ NameComPortSysArr = nullptr;
NameComPortSysArr=ComPort->GetPortNames();
for each(String^ PortName in NameComPortSysArr){
СomBoxComPort->AddItemsCore(PortName);
}//end for

Еще есть вопрос, тоже наверняка простой, в проекте одна форма (Form1) на нее поместил, компонент ком порта и кнопку.
Добавил к проекту еще одну форму ( Form2 ) как сделать что бы, при нажатии на кнопку на первой форме, показалась
вторая Form2::Show(); Пробовал #include form2.h ошибка при компиляции. И , что бы с формы два был доступен компонент,
который поместил на первую форму.
Go to the top of the page
 
+Quote Post
Xenia
сообщение Mar 2 2010, 22:39
Сообщение #7


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(DpInRock @ Mar 1 2010, 20:36) *
Прочитать соответсвующее поле реестра.

Это плохой способ, т.к. он годится только для хардверных COM-портов. А на виртуальных COM-портах (USB/COM-конверторы) эта затея не проходит - после выдергивания конвертора из гнезда, в реестре его описание продолжает оставаться. Это метод показывает не реально доступные в системе порты, а весь список когда-либо в ней существовавших.

Цитата(Yaumen @ Mar 2 2010, 16:57) *
Если лень разбираться, то существует множество классов для перечисления доступных портов.
Например, вот здесь:
http://naughter.com/enumser.html

Красотища! Все способы испробовали! Крайне познавательные исходники. Спасибо!
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 2 2010, 23:22
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Xenia @ Mar 3 2010, 01:39) *
Это плохой способ...

Вот только не надо рубить сплеча.

Во-первых, никто, кажется, не ставил условия отображать только физически подключенные в данный момент порты (в "хардверный" тоже может быть ничего не воткнуто, и что?) Во-вторых, Prolific'овские конвертеры и CDC-устройства, например, замечательно из реестра исчезают при отключении.
Go to the top of the page
 
+Quote Post
V_G
сообщение Mar 3 2010, 00:26
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Цитата(Xenia @ Mar 3 2010, 08:39) *
А на виртуальных COM-портах (USB/COM-конверторы) эта затея не проходит - после выдергивания конвертора из гнезда, в реестре его описание продолжает оставаться. Это метод показывает не реально доступные в системе порты, а весь список когда-либо в ней существовавших.

Не, я специально перед написанием поста попробовал, воткнул девайс с FT232 и еще USB-COM. Все корректно появилось и корректно исчезло после выдергивания. Именно в той ветке реестра, что указана. Ну, может у меня одного...

Еще, есть туча USB-конверторов, что работают некорректно. Возможно, и с реестром в том числе. Я свой специально подбирал, предварительно читал обзоры в инете.

Сообщение отредактировал V_G - Mar 3 2010, 00:29
Go to the top of the page
 
+Quote Post
msalov
сообщение Mar 3 2010, 08:39
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Цитата(Xenia @ Mar 3 2010, 00:39) *
Это плохой способ, т.к. он годится только для хардверных COM-портов. А на виртуальных COM-портах (USB/COM-конверторы) эта затея не проходит - после выдергивания конвертора из гнезда, в реестре его описание продолжает оставаться. Это метод показывает не реально доступные в системе порты, а весь список когда-либо в ней существовавших.

Пробовал cp2102 и ft232r на windows xp pro - все порты появляются и исчезают при подключении/отключении как положено.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Mar 4 2010, 01:49
Сообщение #11


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Из диспетчера устройств они точно исчезают все(ну правда может быть я чего-то не знаю).
Может быть как-нибудь подобраться с той стороны?
Доподленно известно, что в реестре могут оставаться устройства-фантомы. Причём они сконфигурированы и готовы, но в диспетчере устройств не отображаются по причине их физического удаления(ну попробуйте даже ту-же сетевуху, я не знаю). Правда про конкретную ветку реестра сказать тоже ничего не могу.
Мне кажется должно это как-то через API решаться так сказать стандартным способом, а не вычитыванием реестра....

Хотя не знаю точно...я так...типа идеи только подкидываю.... я вообще тут проездом....))))))


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Xenia
сообщение Mar 4 2010, 07:42
Сообщение #12


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(sigmaN @ Mar 4 2010, 04:49) *
Доподленно известно, что в реестре могут оставаться устройства-фантомы. Причём они сконфигурированы и готовы, но в диспетчере устройств не отображаются по причине их физического удаления

Именно так. Диспетчер устройств на включения/отключения USB-устройств реагирует правильно, но записи в реестре не обязаны отслеживать реальную динамику.
Более того, запись в реестре по поводу того или иного USB/COM-конвертора и не должна удаляться при его отключении, т.к. компьютер должен помнить номер COM-порта этого устройства, чтобы при повторном его присоединении номер порта не изменялся.
Поэтому идея доставать номера COM-портов из реестра крайне неудачная, ибо в реестре этих COM-портов может быть описано больше, чем реально имеется в данный момент.
Что же касается самого диспетчера устройств, то очевидно, что данные он берет не из реестра.
Наиболее хорош способ через API-функцию EnumPorts(), она всегда сообщает правду. Недостаток ее только в том, что в полях заполняемой ею структуры нет всех тех данных, которые сообщает диспетчер устройств. А в частности мне не удалось с ее помощью различать настоящие COM-порты от виртуальных, когда как диспетчер устройств это явно показывает. Но для определения наличия портов способностей этой функции вполне достаточно.

Сообщение отредактировал rezident - Mar 4 2010, 13:38
Причина редактирования: Излишнее цитирование.
Go to the top of the page
 
+Quote Post
V_G
сообщение Mar 4 2010, 08:30
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



В той ветке реестра, о которой писалось выше, порты появляются и исчезают в соответствии с динамикой подключения. Фантомные устройства сидят где-то в другой ветке. В свое время по инструкции от FTDI (что-то про реестр там говорилось) я заставил показываться фантомы в диспетчере устройств, сейчас там 70 компортов (частично с одинаковыми номерами). А в HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM в реестре - честно 4 коморта
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 4 2010, 08:40
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Xenia @ Mar 4 2010, 10:42) *
...Более того, запись в реестре по поводу того или иного USB/COM-конвертора и не должна удаляться при его отключении, т.к. компьютер должен помнить номер COM-порта этого устройства, чтобы при повторном его присоединении номер порта не изменялся.
Поэтому идея доставать номера COM-портов из реестра крайне неудачная, ибо в реестре этих COM-портов может быть описано больше, чем реально имеется в данный момент.

Кхм. А вас не смущает, что еще не было приведено ни одного примера, когда порт не исчезает из реестра?
Go to the top of the page
 
+Quote Post
msalov
сообщение Mar 4 2010, 09:04
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Цитата(Xenia @ Mar 4 2010, 09:42) *
Более того, запись в реестре по поводу того или иного USB/COM-конвертора и не должна удаляться при его отключении, т.к. компьютер должен помнить номер COM-порта этого устройства, чтобы при повторном его присоединении номер порта не изменялся.

А она и не удаляется, просто эта запись делается изначально в другом месте, и Вы в этом убедитесь, если заглянете в ветку (пример) "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\Vid_10c4&Pid_ea60\0001" где последнее - серийный номер, именно по нему различаются конвертеры с одинаковым vid/pid. Чуть глубже в ветке "Device parameters" есть поле "PortName" в котором и есть номер прта на который будет подключен конвертер.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 6th July 2025 - 02:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.01495 секунд с 7
ELECTRONIX ©2004-2016