Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как определить доступные COM-порты в системе???  (Прочитано 45100 раз)
0 Пользователей и 11 Гостей смотрят эту тему.
winbinar
Интересующийся

by
Offline Offline

« : 07-11-2006 15:12 » 

С помощью каких функций или по какому принципу можно быстро определить все доступные COM-порты в системе?

Спасибо!
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 07-11-2006 15:34 » 

Именно реально доступные? Делаешь цикл от 1 до 256 (больше не бывает) и открываешь каждый CreateFile.
если ок - значит доступен.

Конкретный код со всеми подробностями поищи на форуме. Уже много раз было.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
asker
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 08-11-2006 09:52 » 

Джон, а почему не воспользоваться функцией EnumPorts
Записан

С уважением, asker
winbinar
Интересующийся

by
Offline Offline

« Ответ #3 : 08-11-2006 10:02 » 

asker, EnumPorts относится к портам принтера.
Я вот пробовал юзать связку:
ComDBOpen
ComDBClaimNextFreePort
ComDBClose

Так вторая команда возвращает код ошибки
ERROR_NO_LOG_SPACE
Записан
asker
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 08-11-2006 10:21 » 

1-ый раз запускаешь - узнаешь размер буфера под все возвращенные порты, а 2-ой раз - получаем список имен портов. Если надо - я выложу кусок кода (< 20 строк)

winbinar, а к портам принтера com-порты отнести нельзя? Помойму можно, по крайне мере, у меня она работает и показывает все com-ы
А про функции ComDBOpen, ComDBClaimNextFreePort, ComDBClose - я ими не пользовался, и в MSDN 2005 я про них не нашел
Записан

С уважением, asker
winbinar
Интересующийся

by
Offline Offline

« Ответ #5 : 08-11-2006 11:26 » 

asker, Выложи если не трудно.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 08-11-2006 11:59 » 

Джон, а почему не воспользоваться функцией EnumPorts

Потому, что EnumPorts вернёт так же порты которые заняты или недоступны (типа USBCOM - хотя тут я не уверен, давно дело было, а проверить быстренько нет возможности). А так ты получаешь именно доступные, свободные порты, а не вообще ВСЕ. Для этого кстати можно просто в реестре посмотреть. Если очень интересно могу глянуть.

winbinar, я не понял, а в чём проблема-то? Чем тебя мой вариант не устраивает? Слишком дешёвый и сердитый? Ага Хотя конечно, если оплата идёт построчно, то за 20 строчек кода заплатять больше чем за 5. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
winbinar
Интересующийся

by
Offline Offline

« Ответ #7 : 08-11-2006 12:35 » 

Джон, Да медленно работает этот цикл...
Хотелось бы как-то элегантно, что ли, подойти к этому вопросу...
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #8 : 08-11-2006 12:45 » 

winbinar, хе? Что значит для тебя медленно? И что значит элегантно? В твоём первом сообщении говорилось:

быстро определить все доступные COM-порты в системе?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
winbinar
Интересующийся

by
Offline Offline

« Ответ #9 : 08-11-2006 13:17 » new

Джон, Для меня быстро - значит за максимально короткое машинное время. И CreateFile почему-то не открывает порты, начиная с COM10 (определяет как отсутствующие).
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 08-11-2006 13:38 » 

медленно Жаль а что порты появляются в realtime?
и доступ к портам старше 10  CreateFile осуществляет по другому, поищи на форуме
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Kolhoznic
Гость
« Ответ #11 : 08-11-2006 14:49 » 

С помощью каких функций или по какому принципу можно быстро определить все доступные COM-порты в системе?

Вот рабочий пример моей программы

HKEY hKey;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"),
0,
KEY_QUERY_VALUE,
&hKey)!=ERROR_SUCCESS)return NULL;
   int  NumVal=0;
             char * pValue0=new char[40];
   char * pValue1=new char[40];
   DWORD cValue1=40,cValue0=40,Type,a;
         
         
   while (!(a=RegEnumValue(hKey,NumVal++,pValue0,&cValue0,NULL,&Type,(LPBYTE)pValue1,&cValue1))||a==ERROR_MORE_DATA))
         {
         SendDlgItemMessage(hDlg,IDC_COMPORTS,CB_ADDSTRING,NULL,(LPARAM)pValue1);
// В pValue1 все возможные КОМ порты...
                   cValue1=cValue0=40;
         }      
delete pValue1;
delete pValue0;
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #12 : 08-11-2006 14:55 » 

Под максимально коротким машинным временем я понимаю один такт. Те ты хочешь за один такт определить все порты? Ну дык - флаг в руки. Тут я пас. Для этого CreateFile в цикле действительно чертовски медленно.

CreateFile почему-то не открывает порты, начиная с COM10 (определяет как отсутствующие).

надо внимательно читать посты-ответы:

Конкретный код со всеми подробностями поищи на форуме. Уже много раз было.

Или проблемы на поиск кликнуть и пару слов ввести? Понимаешь не всегда есть куча времени всё по десять раз рассказывать.

То, что ты пытаешься использовать - COM1-COM9 есть не что иное, как предопределённые константы в винде. Если ты хочешь действительно серъёзно заниматься портами под виндой, то одного вопроса маловато будет. Надо книжки почитать, или хотя бы MSDN.

Цитата: MSDN
The following reserved device names cannot be used as the name of a file: CON, PRN, AUX, CLOCK$, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9. Also avoid these names followed by an extension (for example, NUL.tx7).

А если ты хочешь работать с портами больше 9, то надо исползовать прямое обращение к драйверу например \\.\COM10

И хоть у меня не так много времени, но раз ты такой лентяй, что даже правила форума не читаешь, а хочешь чтобы всё на блюдечке поднесли, то держи:

Вот точно такой же вопрос как у тебя:
https://forum.shelek.ru/index.php/topic,3733.0.html

вот про COM больше СОМ9 в частности:
https://forum.shelek.ru/index.php/topic,7459.0.html
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #13 : 08-11-2006 14:57 » 

Kolhoznic, в твоём коде не выполнено условия доступности. Если например COM1 будет занят (например мышкой), он всё-равно будет показан, но с ним нельзя будет работать. Кстати про это я уже тоже говорил.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Kolhoznic
Гость
« Ответ #14 : 08-11-2006 15:00 » 

Kolhoznic, в твоём коде не выполнено условия доступности. Если например COM1 будет занят (например мышкой), он всё-равно будет показан, но с ним нельзя будет работать. Кстати про это я уже тоже говорил.
Точно... Этот клок проги выводит только присутствующие порты в системе...
Просто тема называлась "Как определить доступные COM-порты в системе???" А вот если "Все свободные" тогда другое дело...
Записан
winbinar
Интересующийся

by
Offline Offline

« Ответ #15 : 08-11-2006 15:15 » 

Джон, Спасибо за ссылки ! Обязательно посмотрю !!!
Kolhoznic, Ты всё правильно понял. Проверить свободные это уже другая песня, не такая медленная, как перебор всех 255 портов.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #16 : 08-11-2006 15:17 » 

Это уже болтология. Ага Какая разница между "свободный" и "доступный"? Если порт уже занят, или не свободен, то доступа к нему нельзя получить. Или можно? Ага

winbinar, я ща заметил, что старый код почему-то повреждён. Если в интересующем тебя куске не разберёшься, то стучись.
« Последнее редактирование: 08-11-2006 15:18 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #17 : 08-11-2006 15:25 » 

это уже другая песня, не такая медленная, как перебор всех 255 портов.

winbinar, не обижайся, но я бы сказал, что в тебе говорит юношеский максимализм, хоть это и на фиг не надо - "а я сиравно хачу пабысраму". Ведь ты не сможешь привести пример, когда действительно необходима бешенная скорость при определении СОМ портов?

1. Как уже справедливо заметил Sla - они не меняются мгновенно. Только в этом случае тебе нужна будет бешенная скорость.

2. Согласен, что создание хендла, с последующим удалением требует времени, большего чем просто опрос тесктовой переменной. Хотя там тоже хендлы создаются. Дело не в этом. Просто это реально будет происходить только с теми которые доступны и существуют, для всех остальных ф-я сразу вернёт INVALID_HANDLE_VALUE. Вот и всё.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
winbinar
Интересующийся

by
Offline Offline

« Ответ #18 : 08-11-2006 15:45 » 

Джон, Просто моя прога должна работать на дохлых компах типа 486, и я пока не знаю какая будет пауза перед открытием окна параметров портов (с учётом мультитрединга). Поэтому и рассматриваю альтернативные варианты.
Можно, конечно, делать проверку один раз при запуске программы... Но тогда порт может быть занят другой программой, запущенной позже, а в списке будет...
В общем, тестирование покажет...
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #19 : 08-11-2006 16:27 » 

А какую винду ты собираешься на них ставить? Даже если 95, то тут я могу тебя успокоить. Если что и будет торомозить под 486 так это сама винда. А CreateFile это АПИшная ф-я, те часть самой системы. Так что не волнуйся.

Более того, если учитывать условие:
порт может быть занят другой программой, запущенной позже
то у тебя просто нет другого выхода. Моё решение в данном случае единственное приемлемое. Определить, свободен в ДАННЫЙ конкретный момент порт или нет, ты сможешь только протестировав его, те открыв. Так что не заморачивайся.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #20 : 08-11-2006 16:30 » 

зы Ещё одно, совсем не обязательно сканировать все 256. Тут работает принцип разумной достаточности. Я видел за всю свою жизнь только один раз контроллер с 64мя СОМ-портами.
Ребятки из Сименса отчудили. А так первых 9ти вполне достаточно. Если только конечно, какой нить умник не захочет установить USB на COM124 Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
asker
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #21 : 09-11-2006 13:41 » 

Ух как много наговорили... Улыбаюсь
Но это хорошо.
Winbar ты просил код. Вот он
Код:
	// Инициализируем ComboBox, содержащий имена портов
CComboBox* pCombo = (CComboBox*) GetDlgItem(IDC_COMBO_PORT);
DWORD bytesNeeded, returned, i;
PORT_INFO_1* pPortInfo1;
CString strNamePort;
BYTE* pBuffer;

// Определяем размер нужного нам буфера...
if (!EnumPorts(NULL, 1, NULL, 0, &bytesNeeded, &returned) && GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
pBuffer = new BYTE[bytesNeeded];
// Получаем список имен портов
EnumPorts(NULL, 1, pBuffer, bytesNeeded, &bytesNeeded, &returned);
// Удаляем все элементы из combo
pCombo->ResetContent();
// Заполняем combo именами всех подходящих портов
for(i = 0; i < returned; i++) {
pPortInfo1 = (PORT_INFO_1*) ( pBuffer + i * sizeof(PORT_INFO_1) );
strNamePort = pPortInfo1->pName;
strNamePort = strNamePort.MakeUpper();
if (strNamePort.Find("COM") != -1) {
strNamePort.Delete(strNamePort.GetLength() - 1);
pCombo->AddString(strNamePort);
}
}
delete pBuffer;
}

Но этот код показывает все COM-ы, включая и виртуальные (USBCOM, как сказал Джон) и уже открытые, так что...
Записан

С уважением, asker
asker
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #22 : 09-11-2006 13:46 » 

Кстати, почему у меня во многих постах код коряво отображается, прямо скажем совсем не читабельно. Никто не сталкивался?
Записан

С уважением, asker
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines