Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как определить имена существующих ком портов
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
sergey sva
Как определить имена существующих ком портов, на vs ?
DpInRock
Прочитать соответсвующее поле реестра.
msalov
Цитата(DpInRock @ Mar 1 2010, 19:36) *
Прочитать соответсвующее поле реестра.

А точнее "HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM"
V_G
В цикле поочередно пытаюсь открыть все возможные компорты (CreateFile) из списка, полученного из вышеупомянутого поля реестра. Если возвращается INVALID_HANDLE_VALUE, порт недоступен. Если открытие прошло успешно, добавляю № порта в список доступных и закрываю порт.
В результате имею список доступных на данный момент портов.
Yaumen
Если лень разбираться, то существует множество классов для перечисления доступных портов.

Например, вот здесь:
http://naughter.com/enumser.html
sergey sva
Да проще будет использовать готовый класс.
Код
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 ошибка при компиляции. И , что бы с формы два был доступен компонент,
который поместил на первую форму.
Xenia
Цитата(DpInRock @ Mar 1 2010, 20:36) *
Прочитать соответсвующее поле реестра.

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

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

Красотища! Все способы испробовали! Крайне познавательные исходники. Спасибо!
aaarrr
Цитата(Xenia @ Mar 3 2010, 01:39) *
Это плохой способ...

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

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

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

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

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

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

Именно так. Диспетчер устройств на включения/отключения USB-устройств реагирует правильно, но записи в реестре не обязаны отслеживать реальную динамику.
Более того, запись в реестре по поводу того или иного USB/COM-конвертора и не должна удаляться при его отключении, т.к. компьютер должен помнить номер COM-порта этого устройства, чтобы при повторном его присоединении номер порта не изменялся.
Поэтому идея доставать номера COM-портов из реестра крайне неудачная, ибо в реестре этих COM-портов может быть описано больше, чем реально имеется в данный момент.
Что же касается самого диспетчера устройств, то очевидно, что данные он берет не из реестра.
Наиболее хорош способ через API-функцию EnumPorts(), она всегда сообщает правду. Недостаток ее только в том, что в полях заполняемой ею структуры нет всех тех данных, которые сообщает диспетчер устройств. А в частности мне не удалось с ее помощью различать настоящие COM-порты от виртуальных, когда как диспетчер устройств это явно показывает. Но для определения наличия портов способностей этой функции вполне достаточно.
V_G
В той ветке реестра, о которой писалось выше, порты появляются и исчезают в соответствии с динамикой подключения. Фантомные устройства сидят где-то в другой ветке. В свое время по инструкции от FTDI (что-то про реестр там говорилось) я заставил показываться фантомы в диспетчере устройств, сейчас там 70 компортов (частично с одинаковыми номерами). А в HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM в реестре - честно 4 коморта
aaarrr
Цитата(Xenia @ Mar 4 2010, 10:42) *
...Более того, запись в реестре по поводу того или иного USB/COM-конвертора и не должна удаляться при его отключении, т.к. компьютер должен помнить номер COM-порта этого устройства, чтобы при повторном его присоединении номер порта не изменялся.
Поэтому идея доставать номера COM-портов из реестра крайне неудачная, ибо в реестре этих COM-портов может быть описано больше, чем реально имеется в данный момент.

Кхм. А вас не смущает, что еще не было приведено ни одного примера, когда порт не исчезает из реестра?
msalov
Цитата(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" в котором и есть номер прта на который будет подключен конвертер.
sergey sva
Буду использовать метод который просматривает реестр, с определением портов понял , а как например определить какой
порт какую скорость поддерживает сколько бит данных, стоповых тоже в какой то ветке есть запись ?
V_G
По-моему, любой порт поддерживает любое сочетание параметров, какое зададите (во вменяемом диапазоне, понятно).
В терминале (родном виндовом) у меня у хардовых портов можно выставить скорость до 115 кБод (по-моему), у виртуальных (USB-COM) - до 960 кБод.
По сути это должно определяться драйвером, тесно привязанным к аппаратуре.
Nik.
На сегодняшний день мы делаем так !! с ипользованием 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. А она даем Вам что умеет порт.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.