|
Как определить имена существующих ком портов |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 17)
|
Mar 2 2010, 13:57
|
Частый гость
 
Группа: Свой
Сообщений: 187
Регистрация: 22-06-05
Из: Минск, Беларусь
Пользователь №: 6 213

|
Если лень разбираться, то существует множество классов для перечисления доступных портов. Например, вот здесь: http://naughter.com/enumser.html
|
|
|
|
|
Mar 2 2010, 17:19
|
Гуру
     
Группа: Свой
Сообщений: 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 ошибка при компиляции. И , что бы с формы два был доступен компонент, который поместил на первую форму.
|
|
|
|
|
Mar 2 2010, 22:39
|

Гуру
     
Группа: Модератор 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 Красотища! Все способы испробовали! Крайне познавательные исходники. Спасибо!
|
|
|
|
|
Mar 3 2010, 00:26
|

Профессионал
    
Группа: Свой
Сообщений: 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
|
|
|
|
|
Mar 4 2010, 07:42
|

Гуру
     
Группа: Модератор 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
Причина редактирования: Излишнее цитирование.
|
|
|
|
|
Mar 4 2010, 09:04
|
Знающий
   
Группа: Свой
Сообщений: 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" в котором и есть номер прта на который будет подключен конвертер.
|
|
|
|
|
Mar 19 2010, 18:13
|
Группа: Участник
Сообщений: 9
Регистрация: 27-02-08
Пользователь №: 35 443

|
На сегодняшний день мы делаем так !! с ипользованием Setup Device Information api (Написано в Builder С++) Код try { HDEVINFO hDI; Tstring List *sl_com_fullnames = new TStringLis(); SP_DEVINFO_DATA DDI; DWORD uReq, uTyp, uEnum; BOOL fErr; char IdBuffer[ 1024 ];
DDI.cbSize = sizeof( SP_DEVINFO_DATA );
//Получение GUID_DEVCLASS_MULTIPORTSERIAL hDI = SetupDiGetClassDevs( &GUID_DEVCLASS_MULTIPORTSERIAL, NULL, NULL, DIGCF_PRESENT | DIGCF_PROFILE ); uEnum = 0; do {
fErr = SetupDiEnumDeviceInfo( hDI, uEnum, &DDI ); if( !fErr ) break; fErr = SetupDiGetDeviceRegistryProperty( hDI, &DDI, SPDRP_FRIENDLYNAME, &uTyp, IdBuffer, 1024, &uReq ); if( !fErr ) fErr = SetupDiGetDeviceRegistryProperty( hDI, &DDI, SPDRP_DEVICEDESC, &uTyp, IdBuffer, 1024, &uReq );
sl_com_fullnames->Add( IdBuffer); uEnum ++; } while( 1 );
//Устройств GUID_DEVCLASS_PORTS hDI = SetupDiGetClassDevs( &GUID_DEVCLASS_PORTS, NULL, NULL, DIGCF_PRESENT | DIGCF_PROFILE ); uEnum = 0; do {
fErr = SetupDiEnumDeviceInfo( hDI, uEnum, &DDI ); if( !fErr ) break; fErr = SetupDiGetDeviceRegistryProperty( hDI, &DDI, SPDRP_FRIENDLYNAME, &uTyp, IdBuffer, 1024, &uReq ); if( !fErr ) fErr = SetupDiGetDeviceRegistryProperty( hDI, &DDI, SPDRP_DEVICEDESC, &uTyp, IdBuffer, 1024, &uReq );
sl_com_fullnames->Add( IdBuffer ); uEnum ++; } while( 1 ); Цитата(V_G @ Mar 5 2010, 13:07)  По-моему, любой порт поддерживает любое сочетание параметров, какое зададите (во вменяемом диапазоне, понятно). В терминале (родном виндовом) у меня у хардовых портов можно выставить скорость до 115 кБод (по-моему), у виртуальных (USB-COM) - до 960 кБод. По сути это должно определяться драйвером, тесно привязанным к аппаратуре. Я вроде знаю для того тчобы узнать настройки, Вы должны открыть порт и запустить функцию GetCommProperties. А она даем Вам что умеет порт.
Сообщение отредактировал rezident - Mar 20 2010, 02:56
Причина редактирования: Оформление цитаты исходника.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|