ФСЕТАН - проведение экспертизы промышленной безопасности ту.
C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как получить список COM портов
klen
Отправлено: 20.11.2005, 12:44


Машинист паровоза

Группа: Участник
Сообщений: 239



Как это сделать правильно?
Вызывать CreateFile с COM1 COM2 .... и анализировать результат это както плохо, потому что не известно какой порт будет крайним..
londinium
Отправлено: 20.11.2005, 15:59


Не зарегистрирован







Можно пробежаться в цикле от 1 до 5 и попробовать открывать порт с номером i. Я пробовал — действительно помогает.
klen
Отправлено: 20.11.2005, 18:44


Машинист паровоза

Группа: Участник
Сообщений: 239



Не поможет!
Я могу виртуальный порт создать под номером COM725 например — че тогда?

Нужен именно перечеслитель сомуникационных устройств. Далжно ж это гдето быть...
Отвёрткин
Отправлено: 20.11.2005, 19:36


Ученик-кочегар

Группа: Участник
Сообщений: 5



Есть такая функция

void GetSerialPortsList(LPSTR szSymbol);

сам не применял
Rius
Отправлено: 21.11.2005, 09:31


Мастер участка

Группа: Участник
Сообщений: 321



или так
CODE
//---------------------------------------------------------------------------
void GetSerialPortsList(TStrings* SerialPortList)
{
 AnsiString KeyName = "\\Hardware\\DeviceMap\\SerialComm";
 TStringList *SerialCommValues = new TStringList();

 TRegistry *Registry = new TRegistry;
 try
 {
   Registry->RootKey = HKEY_LOCAL_MACHINE;
   Registry->OpenKeyReadOnly( KeyName );
   Registry->GetValueNames( SerialCommValues );

   SerialPortList->Clear();
   for(int i=0; i<SerialCommValues->Count; i++)
   {
     SerialPortList->Add( Registry->ReadString(SerialCommValues->Strings[i]));
   }

 }
 __finally
 {
   delete Registry;
   delete SerialCommValues;
 }
}
//---------------------------------------------------------------------------
klen
Отправлено: 21.11.2005, 10:39


Машинист паровоза

Группа: Участник
Сообщений: 239



QUOTE (Отвёрткин @ 20/11/2005, 19:36)
Есть такая функция

void GetSerialPortsList(LPSTR szSymbol);

сам не применял

Это где эта функция то определена??? Чето найти не могу.




2_Rius
К сожалению информация об устройствах в записях \\Hardware\\DeviceMap\\SerialComm значительно отличается от той что выдает диспетчер усттройств, как он перечисляет устройства???

Отредактировано klen — 21/11/2005, 11:00
Отвёрткин
Отправлено: 21.11.2005, 13:03


Ученик-кочегар

Группа: Участник
Сообщений: 5



QUOTE (klen @ 21/11/2005, 13:39)
QUOTE (Отвёрткин @ 20/11/2005, 19:36)
Есть такая функция

void GetSerialPortsList(LPSTR szSymbol);

сам не применял

Это где эта функция то определена??? Чето найти не могу.

Насколько я понял это Win32 API, для обращения из обычьной программы написаной на билдире уже определена по умолчанию.

Отредактировано Отвёрткин — 21/11/2005, 16:13
Отвёрткин
Отправлено: 21.11.2005, 13:44


Ученик-кочегар

Группа: Участник
Сообщений: 5



В соседнем форуме посмотри
COM-порты. Найти всех
Особено если используешь VaComm
londinium
Отправлено: 21.11.2005, 20:52


Не зарегистрирован







Здравствуйте!

На API это сделать вряд ли возможно. Вот цитата из MSDN July2000

"One thing to note about port names is that traditionally they have been COM1, COM2, COM3, or COM4. The Win32 API does not provide any mechanism for determining what ports exist on a system. Windows NT and Windows 95 keep track of installed ports differently from one another, so any one method would not be portable across all Win32 platforms. Some systems even have more ports than the traditional maximum of four. Hardware vendors and serial-device-driver writers are free to name the ports anything they like. For this reason, it is best that users have the ability to specify the port name they want to use. If a port does not exist, an error will occur (ERROR_FILE_NOT_FOUND) after attempting to open the port, and the user should be notified that the port isn’t available."

Буду рад, если кто-то просветит, что пишут по этому поводу в более поздних версиях MSDN

klen
Отправлено: 21.11.2005, 21:57


Машинист паровоза

Группа: Участник
Сообщений: 239



QUOTE (londinium @ 21/11/2005, 20:52)
One thing to note about port names is that traditionally they have been COM1, COM2, COM3, or COM4. The Win32 API does not provide any mechanism for determining what ports exist on a system.

Полностью согласен с Билли...

А вообще то есть метод, залесть в ядро и прочитать структуры там! это можно но это не поправилам. Видимо менеджер устройств именно так и делает. А вот в какой степени реестр отражает текущую ситуацию ... это вообще непонятно.

Отредактировано klen — 21/11/2005, 22:00
Rius
Отправлено: 22.11.2005, 09:18


Мастер участка

Группа: Участник
Сообщений: 321



везде где мы пробовали, реестр список портов отображает правильно
странно, что у вас не совпадает
Отвёрткин
Отправлено: 22.11.2005, 11:07


Ученик-кочегар

Группа: Участник
Сообщений: 5



QUOTE (Rius @ 22/11/2005, 12:18)
везде где мы пробовали, реестр список портов отображает правильно
странно, что у вас не совпадает

Вопрос. Даже для, PnP Com-портов через USB, которые подключаются/отключаются на ходу ?

Поиск перебором существующих портов через CreateFile действительно плох. В последовательности номеров могут быть пропуски. Из собственного опыта, драйвер платы PCI дополнительных портов создавал порты COM5 и COM6, а COM3 и COM4 отсутствовали.
И где останавливать поиск?
Rius
Отправлено: 22.11.2005, 14:18


Мастер участка

Группа: Участник
Сообщений: 321



QUOTE (Отвёрткин @ 22/11/2005, 14:07)
QUOTE (Rius @ 22/11/2005, 12:18)
везде где мы пробовали, реестр список портов отображает правильно
странно, что у вас не совпадает

Вопрос. Даже для, PnP Com-портов через USB, которые подключаются/отключаются на ходу ?

для них тоже
user posted image подключаю/отключаю адаптер, нажимаю в редакторе реестра F5 и наблюдаю соответствующий список портов.

Gedeon надеюсь картинка не слишком большая

Отредактировано Rius — 22/11/2005, 19:59
Gedeon
Отправлено: 22.11.2005, 16:40


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (Rius @ 22/11/2005, 14:18)
image ...

Вы можете прямо к сообщению прикладывать файл с изображением например в формате *.jpg и он будет прямо в посте отображаться, все же легче чем ложить файл на другой сервак и давать на него ссылку.
Отвёрткин
Отправлено: 22.11.2005, 18:49


Ученик-кочегар

Группа: Участник
Сообщений: 5



2_Rius Спасибо, буду иметь ввиду на будущее.
klen
Отправлено: 30.11.2005, 11:03


Машинист паровоза

Группа: Участник
Сообщений: 239



Ну дык всеже как "это проворачивает" диспетчет устройств. Он что, открывает ключ реестра и ожидает пока состояние хендла не изменится в случе подключения сериального устройства? Бред какойто.

Вернуться в Работа с внешними устройствами