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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Информация о COM портах
schulgin
сообщение Dec 20 2014, 11:59
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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/ , но информацию с неё можнополучить только через создаваемый ею текстовый файл, что меня не устраивает. Не устраивает не то, что он текстовый, а то, что это файл вне программы.
Кто чего может предложить?
Go to the top of the page
 
+Quote Post
kovigor
сообщение Dec 20 2014, 12:13
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(schulgin @ Dec 20 2014, 15:59) *
Как программно выяснить какие порты в ПК задействованы и их параметры?

Задействованы ? Попробуйте открыть порт. Если вы получите ошибку, значит, порт чем-то занят . Например, к нему подключены мышь или модем. Почитайте статью Титова Олега:
http://ir.nmu.org.ua/bitstream/handle/1234....pdf?sequence=1
Go to the top of the page
 
+Quote Post
schulgin
сообщение Dec 20 2014, 13:30
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
kovigor
сообщение Dec 20 2014, 13:38
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



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

Не сомневаюсь, честно говоря, что это так. ИМХО, максимум, что вы можете сделать - это запросить соотв. информацию у ОС. А вот отуда она ее возьмет - вопрос. Разумно предположить, что прочитает из реестра. Но вот отуда именно - вопрос. Нужно искать в Сети ...
Go to the top of the page
 
+Quote Post
schulgin
сообщение Dec 20 2014, 15:51
Сообщение #5


Участник
*

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



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

Собственно говоря, этот путь мне видется наиболее реальным. Всего то нужно прочитать, что находится в диспетчере устройств в разделе "Порты".
Go to the top of the page
 
+Quote Post
Lagman
сообщение Dec 20 2014, 18:42
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



В примерах к QT (в последней версии) есть такая программа (может что то и не показывает), но с использованием QT.
Go to the top of the page
 
+Quote Post
schulgin
сообщение Dec 20 2014, 19:20
Сообщение #7


Участник
*

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



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

Что такое QT?
Go to the top of the page
 
+Quote Post
kovigor
сообщение Dec 20 2014, 19:29
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



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

Вот, кажется, то, что нужно:
http://delphiregedit.narod.ru/regeditxp/Chapter7/Index.htm
Go to the top of the page
 
+Quote Post
Xenia
сообщение Dec 20 2014, 23:46
Сообщение #9


Гуру
******

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



Цитата(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-портов.
Go to the top of the page
 
+Quote Post
megajohn
сообщение Dec 21 2014, 01:36
Сообщение #10


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

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(Xenia @ Dec 21 2014, 03:46) *
Реестровые ключи годятся только для "стационарных" COM-портов...


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



--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
Xenia
сообщение Dec 21 2014, 02:24
Сообщение #11


Гуру
******

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



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


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

Таким образом, информация из реестра позволяет лишь сократить число проверок "открыть-закрыть", исключив из испытаний неинсталлированные порты, но не может служить заменой этому тесту.
Go to the top of the page
 
+Quote Post
редактор
сообщение Dec 22 2014, 08:37
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 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


--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
Go to the top of the page
 
+Quote Post
schulgin
сообщение Dec 22 2014, 14:52
Сообщение #13


Участник
*

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



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

Наименование подключённного устройства показывает?
Go to the top of the page
 
+Quote Post
toweroff
сообщение Dec 22 2014, 18:32
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



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

так имена же в ts->Strings[i]
Go to the top of the page
 
+Quote Post
SM
сообщение Dec 22 2014, 19:01
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 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. Это решит непонятную проблему "файлов вне программ" (еще бы понять, что это вообще такое).
Go to the top of the page
 
+Quote Post

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

 


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


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