|
Информация о COM портах |
|
|
|
Dec 20 2014, 11:59
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 27-06-07
Пользователь №: 28 739

|
Как программно выяснить какие порты в ПК задействованы и их параметры? В первую очередь интересует какие устройства к ним подключены, параметры обмена (скрость, чётность и т.д.), занят порт приложенем или нет. На первых порах было бы достаточно информации, которую выдаёт диспетчер устройств. Просматривал такие варианты: 1. Программа devcon от Microsoft http://support.microsoft.com/kb/311272 , но для её использования есть существенное НО, она может использоваться только под администратором. 2. Программа msinfo32 http://www.windowsfaq.ru/content/view/122/57/ , но информацию с неё можнополучить только через создаваемый ею текстовый файл, что меня не устраивает. Не устраивает не то, что он текстовый, а то, что это файл вне программы. Кто чего может предложить?
|
|
|
|
|
Dec 20 2014, 13:30
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 27-06-07
Пользователь №: 28 739

|
Цитата(kovigor @ Dec 20 2014, 16:13)  Задействованы ? Попробуйте открыть порт. Если вы получите ошибку, значит, порт чем-то занят . Например, к нему подключены мышь или модем. Почитайте статью Титова Олега: http://ir.nmu.org.ua/bitstream/handle/1234....pdf?sequence=1Если порт занят, то его не открыть и, соответственно, программно поизучать его нет возможности. Максимум, что с помощью API для моих нужд можно сделать, так это увидеть какие порты используются. А ссылка очень полезная, спасибо, первый раз увидел такую глубокую и полную информацию.
Сообщение отредактировал schulgin - Dec 20 2014, 13:32
|
|
|
|
|
Dec 20 2014, 13:38
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(schulgin @ Dec 20 2014, 17:30)  Если порт занят, то его не открыть и, соответственно, программно поизучать его нет возможности. Максимум, что с помощью API для моих нужд можно сделать, так это увидеть какие порты используются. Не сомневаюсь, честно говоря, что это так. ИМХО, максимум, что вы можете сделать - это запросить соотв. информацию у ОС. А вот отуда она ее возьмет - вопрос. Разумно предположить, что прочитает из реестра. Но вот отуда именно - вопрос. Нужно искать в Сети ...
|
|
|
|
|
Dec 20 2014, 15:51
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 27-06-07
Пользователь №: 28 739

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

Группа: Участник
Сообщений: 50
Регистрация: 27-06-07
Пользователь №: 28 739

|
Цитата(Lagman @ Dec 20 2014, 22:42)  В примерах к QT (в последней версии) есть такая программа (может что то и не показывает), но с использованием QT. Что такое QT?
|
|
|
|
|
Dec 20 2014, 23:46
|

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

|
Цитата(kovigor @ Dec 20 2014, 22:29)  Реестровые ключи годятся только для "стационарных" COM-портов, выполненных на материнской плате или на плате, втыкаемой в ее слот. Те же порты, которые являются витуальными порождениями USB/COM-конверторов или USB CDC устройств, выполненных на МК, записываются в реестр лишь однажды (в момент первой инсталляции), а потому реестр (как и функции по работе с ним) показывают наличие таких CОМ-портов даже в том случае, если они реально отсутствуют (т.е. в последствии были выдернуты из USB-разъема). По этой причине реестровые функции практически бесполезны для обнаружения активных COM-портов, поскольку встроенные порты обычно всегда имеют имена COM1 и COM2 по умолчанию, а порты с большими номерами являются виртуальными, на счет которых реестровые функции лгут. Реестровые функции могут представлять интерес только в том случае, если требуется прочесть тип/имя CОМ-порта. Например, чтобы отличить Bluetooth или телефонный модем от остальных COM-портов.
|
|
|
|
|
Dec 22 2014, 08:37
|
Местный
  
Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315

|
Фрагмент компонента под 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-кой и выше программа может запросить права администратора.
Сообщение отредактировал редактор - Dec 22 2014, 08:38
--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
|
|
|
|
|
Dec 22 2014, 14:52
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 27-06-07
Пользователь №: 28 739

|
Цитата(редактор @ Dec 22 2014, 12:37)  Фрагмент компонента под Builder6 - пользую давно (под XP). Показывает только активные порты, в том числе и USB. Наименование подключённного устройства показывает?
|
|
|
|
|
Dec 22 2014, 19:01
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(schulgin @ Dec 20 2014, 14:59)  2. Программа msinfo32 http://www.windowsfaq.ru/content/view/122/57/ , но информацию с неё можнополучить только через создаваемый ею текстовый файл, что меня не устраивает. Не устраивает не то, что он текстовый, а то, что это файл вне программы. Для создания таких файлов в Windows существует специальное место, гарантировано доступное из-под текущего юзера всем программам - получается вызовом GetTempPath. Это решит непонятную проблему "файлов вне программ" (еще бы понять, что это вообще такое).
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|