Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Информация о COM портах
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
schulgin
Как программно выяснить какие порты в ПК задействованы и их параметры? В первую очередь интересует какие устройства к ним подключены, параметры обмена (скрость, чётность и т.д.), занят порт приложенем или нет. На первых порах было бы достаточно информации, которую выдаёт диспетчер устройств. Просматривал такие варианты:
1. Программа devcon от Microsoft http://support.microsoft.com/kb/311272 , но для её использования есть существенное НО, она может использоваться только под администратором.
2. Программа msinfo32 http://www.windowsfaq.ru/content/view/122/57/ , но информацию с неё можнополучить только через создаваемый ею текстовый файл, что меня не устраивает. Не устраивает не то, что он текстовый, а то, что это файл вне программы.
Кто чего может предложить?
kovigor
Цитата(schulgin @ Dec 20 2014, 15:59) *
Как программно выяснить какие порты в ПК задействованы и их параметры?

Задействованы ? Попробуйте открыть порт. Если вы получите ошибку, значит, порт чем-то занят . Например, к нему подключены мышь или модем. Почитайте статью Титова Олега:
http://ir.nmu.org.ua/bitstream/handle/1234....pdf?sequence=1
schulgin
Цитата(kovigor @ Dec 20 2014, 16:13) *
Задействованы ? Попробуйте открыть порт. Если вы получите ошибку, значит, порт чем-то занят . Например, к нему подключены мышь или модем. Почитайте статью Титова Олега:
http://ir.nmu.org.ua/bitstream/handle/1234....pdf?sequence=1

Если порт занят, то его не открыть и, соответственно, программно поизучать его нет возможности. Максимум, что с помощью API для моих нужд можно сделать, так это увидеть какие порты используются. А ссылка очень полезная, спасибо, первый раз увидел такую глубокую и полную информацию.
kovigor
Цитата(schulgin @ Dec 20 2014, 17:30) *
Если порт занят, то его не открыть и, соответственно, программно поизучать его нет возможности. Максимум, что с помощью API для моих нужд можно сделать, так это увидеть какие порты используются.

Не сомневаюсь, честно говоря, что это так. ИМХО, максимум, что вы можете сделать - это запросить соотв. информацию у ОС. А вот отуда она ее возьмет - вопрос. Разумно предположить, что прочитает из реестра. Но вот отуда именно - вопрос. Нужно искать в Сети ...
schulgin
Цитата(kovigor @ Dec 20 2014, 17:38) *
Не сомневаюсь, честно говоря, что это так. ИМХО, максимум, что вы можете сделать - это запросить соотв. информацию у ОС. А вот отуда она ее возьмет - вопрос. Разумно предположить, что прочитает из реестра. Но вот отуда именно - вопрос. Нужно искать в Сети ...

Собственно говоря, этот путь мне видется наиболее реальным. Всего то нужно прочитать, что находится в диспетчере устройств в разделе "Порты".
Lagman
В примерах к QT (в последней версии) есть такая программа (может что то и не показывает), но с использованием QT.
schulgin
Цитата(Lagman @ Dec 20 2014, 22:42) *
В примерах к QT (в последней версии) есть такая программа (может что то и не показывает), но с использованием QT.

Что такое QT?
kovigor
Цитата(schulgin @ Dec 20 2014, 19:51) *
Собственно говоря, этот путь мне видется наиболее реальным. Всего то нужно прочитать, что находится в диспетчере устройств в разделе "Порты".

Вот, кажется, то, что нужно:
http://delphiregedit.narod.ru/regeditxp/Chapter7/Index.htm
Xenia
Цитата(kovigor @ Dec 20 2014, 22:29) *
Вот, кажется, то, что нужно:
http://delphiregedit.narod.ru/regeditxp/Chapter7/Index.htm


Реестровые ключи годятся только для "стационарных" COM-портов, выполненных на материнской плате или на плате, втыкаемой в ее слот. Те же порты, которые являются витуальными порождениями USB/COM-конверторов или USB CDC устройств, выполненных на МК, записываются в реестр лишь однажды (в момент первой инсталляции), а потому реестр (как и функции по работе с ним) показывают наличие таких CОМ-портов даже в том случае, если они реально отсутствуют (т.е. в последствии были выдернуты из USB-разъема).

По этой причине реестровые функции практически бесполезны для обнаружения активных COM-портов, поскольку встроенные порты обычно всегда имеют имена COM1 и COM2 по умолчанию, а порты с большими номерами являются виртуальными, на счет которых реестровые функции лгут.

Реестровые функции могут представлять интерес только в том случае, если требуется прочесть тип/имя CОМ-порта. Например, чтобы отличить Bluetooth или телефонный модем от остальных COM-портов.
megajohn
Цитата(Xenia @ Dec 21 2014, 03:46) *
Реестровые ключи годятся только для "стационарных" COM-портов...


вот делал програмку и однако вполне успешно работает с "активными COM-портами" ( хотя как именно реализовано уже не помню, но кому интересно - есть исходники )

Xenia
Цитата(megajohn @ Dec 21 2014, 04:36) *
вот делал програмку и однако вполне успешно работает с "активными COM-портами" ( хотя как именно реализовано уже не помню, но кому интересно - есть исходники.


Поглядела в исходники и увидела вполне ожидаемый алгоритм: сперва функцией GetPortNames() из реестра извлекается полный список проинсталлированных COM-портов, а затем каждый из этого списка подвергается попытке "открыть-закрыть", чтобы установить, свободен он или занят.

Таким образом, информация из реестра позволяет лишь сократить число проверок "открыть-закрыть", исключив из испытаний неинсталлированные порты, но не может служить заменой этому тесту.
редактор
Фрагмент компонента под Builder6 - пользую давно (под XP). Показывает только активные порты, в том числе и USB.
Код
void __fastcall TComSelect::UpdateList(void)
{
  TRegistry  *reg;
  TStrings   *ts;
  int i;
  reg = new TRegistry();
  reg->RootKey = HKEY_LOCAL_MACHINE;
  reg->OpenKey("\hardware\\devicemap\\serialcomm", false);
  ts = new TStringList();
  reg->GetValueNames(ts);
  Items->Clear();
  for (i = 0;i<ts->Count;i++)
     { Items->Add(reg->ReadString(ts->Strings[i]));
      }
  reg->CloseKey();
  delete ts;
  delete reg;
}

PS: Items - член базового класса TCustomComboBox.
Под 7-кой и выше программа может запросить права администратора.
schulgin
Цитата(редактор @ Dec 22 2014, 12:37) *
Фрагмент компонента под Builder6 - пользую давно (под XP). Показывает только активные порты, в том числе и USB.

Наименование подключённного устройства показывает?
toweroff
Цитата(schulgin @ Dec 22 2014, 17:52) *
Наименование подключённного устройства показывает?

так имена же в ts->Strings[i]
SM
Цитата(schulgin @ Dec 20 2014, 14:59) *
2. Программа msinfo32 http://www.windowsfaq.ru/content/view/122/57/ , но информацию с неё можнополучить только через создаваемый ею текстовый файл, что меня не устраивает. Не устраивает не то, что он текстовый, а то, что это файл вне программы.

Для создания таких файлов в Windows существует специальное место, гарантировано доступное из-под текущего юзера всем программам - получается вызовом GetTempPath. Это решит непонятную проблему "файлов вне программ" (еще бы понять, что это вообще такое).
toweroff
Попробовал код в посте редактора.
Реально видно только то, что подключено. Вынул шнурок USB - нет порта. Вставил - появился.
ДЕЙЛ
попалось случайно на глаза http://articles.org.ru/cn/showdetail.php?cid=9088
мошть пригодится
schulgin
Цитата(SM @ Dec 22 2014, 23:01) *
Для создания таких файлов в Windows существует специальное место, гарантировано доступное из-под текущего юзера всем программам - получается вызовом GetTempPath. Это решит непонятную проблему "файлов вне программ" (еще бы понять, что это вообще такое).

Действительно, когда писал "файлов вне программ" предполагал, что это будет не понятно и беру урок на будущее так не писать. A сказать этим хотел то, что текстовую информацию, выдаваемую программой msinfo32, хочу получить в своей программе не через файл, а в непосредственно в виде строки. То есть запустил msinfo32, а в ответ получил строку.
SM
Цитата(schulgin @ Dec 23 2014, 19:24) *
То есть запустил msinfo32, а в ответ получил строку.

В таком случае, можно попробовать создать в программе Named Pipe, и ее же передать msinfo32 вместо имени файла, как "«\\.\pipe\named_pipe". Не гарантирую, что сработает, но должно.
schulgin
Цитата(SM @ Dec 24 2014, 12:14) *
В таком случае, можно попробовать создать в программе Named Pipe, и ее же передать msinfo32 вместо имени файла, как "«\\.\pipe\named_pipe". Не гарантирую, что сработает, но должно.

Никогда с этим не работал. Как в Windows создать named pipe?
SM
Цитата(schulgin @ Dec 24 2014, 18:28) *
Никогда с этим не работал. Как в Windows создать named pipe?

Все, как всегда, там - http://msdn.microsoft.com/ru-ru/library/wi...v=vs.85%29.aspx
toweroff
SM, а, при других общих, какой смысл в мсинфо, если та же информация автоматом в реестре есть?
SM
Цитата(toweroff @ Dec 24 2014, 18:45) *
SM, а, при других общих, какой смысл в мсинфо, если та же информация автоматом в реестре есть?

А это пусть ТС решает, в чем есть смысл, в чем нет. Да и я не гарантирую, что msinfo32 не обломится в попытке записать отчет в pipe, так, один из вариантов, как получить данные как-бы через файл, но не через файл.

upd:
IMHO, корректно это доставать не через реестр напрямую, а через всякие там SetupDiEnumXxxxxxxx функции, и иже с ними, которые позволяют распотрошить список Device Manager-а до самых глубин.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.