Воскресенье, 19.11.2017, 07:02
GreatHard Venture Capital
Приветствую Вас Гость | RSS
Главная Каталог статей Регистрация Вход
Меню сайта

Поиск

Контакты
 
Velcom  +375 29 1269851
MTS     +375 29 7555482
 
 
 

Каталог TUT.BY RATING ALL.BY Клан Мозгоf.by
Главная » Статьи » разное

Сколько же COM портов в компьтере
Простая задача определения числа последовательных коммуникационных портов в системе (COM портов), была таковой в те времена, когда в компьютерах были реализованы аппаратные порты. Сегодня, когда COM порт есть не в каждом компьютере, и приходится применять различные USB адаптеры, да ещё в системе есть модемы, задача несколько усложняется.
 
Заняться более плотно данным вопросом подтолкнуло наблюдение за мучениями пользователей, использующих программы дающие перечень портов в виде списка COM1, COM3, COM10 т.д. Если у пользователя оказывается несколько устройств, для осуществления правильного выбора ему необходима информация из «Диспетчера устройств», там для каждого порта указано ещё и название устройства. Согласитесь лазать каждый раз в «диспетчер» напрягает.
 
Обычно начинающие программисты дают фиксированный список портов, для выбора пользователем. Если какой то из портов недоступен, просто выводя ругательное сообщение, что порт не удалось открыть. Метод простой, но не наш.
 
Программисты более продвинутые получают список портов из соответствующей ветки реестра "HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM”. Метод получше, но как оказалось не всегда достоверный. Иногда система оставляет здесь информации о несуществующих портах, причём самое интересное, что они открываются. И данный метод тоже не даёт информации как в «диспетчере». Даже раздел ENUM не помогает.
 
Очень продвинутые программисты, не напрягающие себя деталями и во всём доверяющие WINDOWS, используют для решения данных проблем системные функции из SetupAPI.dll. Метод хороший и правильный на все сто процентов. Если вы его используете, данная статья вам не интересна. Вы можете получить список портов со всеми их характеристиками.
 
Но есть программисты, которые ищут приключений, они используют знание, что за COM портами закреплен свой GUID, а в реестре по этому GUID -у можно вынуть всю нужную нам информацию, т.е. сделать то же что делает SetupAPI только без лишних движений. А нужно нам не много.
 
- количество подключенных портов в системе (могут быть и отключенные)
- имена портов в формате COMx
- с каким устройством связан порт (FriendlyName на человеческом языке)
- и класс устройства (тут как правило два варианта Ports или Modem, тоже иногда полезно знать с чем вы имеете дело)
 
Как это получить из реестра я вам не расскажу, должны же вы сами испытать приключения и удовольствие от реализации данного метода.
 
Данная статья для тех. кто пользовал первые два варианта или только ещё собирается их пользовать, короче для тех, кто только начинает работать с портами. Для них я потрудился написать DLL реализующую поиск нужной информации и сейчас расскажу, как её использовать.
 
Сначала нужно определиться в какой среде вы будете использовать GetComPort.dll. К сожалению, она реализована с использованием строковых данных, которые разные у разных сред разработки. Поэтому для скачивания планируется выложить как минимум три версии. Пока две. Первая для Delphi и CodeGear, вторая для Embarcadero. Третья для C++Builder в перспективе.  
 
1. Скопируйте нужный файл GetComPort.dll в каталог с вашим проектом или в каталог C:\WINDOWS\system32
2. Всё можете вызывать процедуры и функции, реализованные в DLL из своего проекта.
 
Получение данных реализовано двумя способами, через процедуры и функции, на любителя. Результат будет одинаков.
 
Первая процедура GetComCount(var intComCount : byte); возвращает в вашу переменную intComCount количество портов в системе. Абсолютно то же делает функция fGetComCount() : byte;
 
Следующая процедура GetComName(intComCount : byte; var stComNames : string); Возвращает имя порта, номер которого указан в переменной intComCount, в виде «COMx» в текстовую строку stComNames.
Тоже делает функция fGetComName(intComCount : byte ) : string;
 
Следующая процедура GetFriendlyName(intComCount : byte; var stFrendlyNames : string); Возвращает имя устройства с которым связан порт, номер которого указан в переменной intComCount, в том же виде в котором его отображает «Диспетчер устройств», в текстовую строку stFrendlyNames.
Тоже делает функция fGetFriendlyName(intComCount : byte) : string;
 
Следующая процедура GetComClass(intComCount : byte; var stClass : string); Возвращает класс устройства с которым связан порт, номер которого указан в переменной intComCount, в текстовую строку stFrendlyNames. Тут, как правило, возможны два варианта: «Ports» что указывает на обычный коммуникационный порт и «Modem», что указывает на внутренний или USB модем, которому назначен данный порт.
Тоже делает функция fGetComClass(intComCount : byte) : string;
 
И на последок самая продвинутая процедура GetComPorts(var stNames : TStringList; var stFriendlyNames : TStringList; var stClass : TStringList); Она возвращает сразу все данные в три списка. Количество портов можно определить по индексу любого из списков. И каждому индексу соответствуют данные для одного порта.
 
Если в системе нет портов вообще. Все функции и процедуры вернут строку 'No Communication Ports in System'. Если вы попробуете указать номер порта больше, чем есть в системе, вернётся строка 'PortNumber out of range'.
 
Количество портов начинается с единицы т.е. если в системе три порта то и вернётся число 3. А для получения строковых данных надо указывать номер порта начиная с «0», т.е. первый порт имеет индекс «0», второй «1» и т.д. Ещё раз напоминаю string и TStringList для среды Delphi и CodeGear, совсем не одно и тоже что string и TStringList в среде Embarcadero и уж тем более в C++Builder. Используйте ту dll которая сделана для вашей среды. Но если вы спец по преобразованию типов можете попробовать вызывать dll из разных сред разработки.
 
Сами библиотеки с примерами лежат Каталоге файлов.
 
Жду отзывов, в первую очередь отрицательных.
Категория: разное | Добавил: quarry (26.09.2011)
Просмотров: 5811 | Теги: com, Port, FriendlyName
Вход

Реклама изделий

Copyright GreatHard © 2017 Сайт управляется системой uCoz