Форум программистов, компьютерный форум CyberForum.ru

Перечисление Com портов - C++

Восстановить пароль Регистрация
 
Dark2013
0 / 0 / 0
Регистрация: 02.02.2013
Сообщений: 7
02.02.2013, 13:48     Перечисление Com портов #1
В общем есть такая задачка, есть девайс, который передают данные по блютузу....в комп через USB воткнут приемник, который работает с компом через виртуальный ком порт....

Для работы использовал QExtSerialPort....все работает все замечательно...

Но если приемник выдернуть и потом воткнуть то порт как был открытым так и останется но работать уже не будет....вероятно сам объект порта уничтожается.... надо проверить....

В общем суть вопроса - каким образом можно отследить в системе появление и новых устройств(портов)... как добраться до перечислений доступных последовательных портов???....скорее всего получится платформозависимая штука, поэтому интересует под винду....
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.02.2013, 13:48     Перечисление Com портов
Посмотрите здесь:

C++ Перечисление переменных
перечисление месяцев C++
Перечисление для дурака C++
Перечисление в BC++ C++
Не работает перечисление C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
02.02.2013, 14:38     Перечисление Com портов #2
я вижу смысл только пытаться открыть порт заново.

или работать с реальным USB устройством (а не эмулирующим СОМ порт как некоторые микросхемы FTDI)
Ведь сам по себе СОМ порт не должен поддерживать Plug'n'Play по идее. Разве нет?
Dark2013
0 / 0 / 0
Регистрация: 02.02.2013
Сообщений: 7
02.02.2013, 14:58  [ТС]     Перечисление Com портов #3
нельзя открыть новый порт....он его и не закрывает))..т.е я после выдергивания проверяю отикрыт ли ком порт - он пишет да открыт))....а если пытаюсь закрыть (после того как выдернул устройство) то прога зависает....скорее всего в реализации qextserialport блокируется какой то поток....я реализацию не смотрел.......

вопрос в том что я знаю что стопроцентов можно получить список доступных портов, я видел прогу в которой чел так делает....))....может есть WINAPI ная какая то функция или структура которая хранит в себе состояние.....тогда я по таймеру мог бы делать опрос и смотреть как появлется и удаляется порт...

Добавлено через 35 секунд
нет возможности работать с реальным USB устройством... мне дали такое железо...надо писать под него....
raxp
10140 / 6527 / 475
Регистрация: 28.12.2010
Сообщений: 21,167
Записей в блоге: 1
02.02.2013, 15:02     Перечисление Com портов #4
...задачу отслеживания выдергивания USB-гаджетов (и даже порта в который установлено), драйвера которых создают в системе виртуальный COM-порт и ассоциируют имя устройства с определенным портом, решил отслеживанием списка устройств через SetupAPI (впрочем, это подходит и для LPT и прочих веток). Если имя не найдено, то порт закрываю и в потоке вызываю перечисление пока не появится ассоциированное имя, если появилось - порт открываю и инициализирую гаджет вновь.

Для сторонних разработчиков реализовал либу "Описание API вызова библиотеки GetNumCom.DLL".
Dark2013
0 / 0 / 0
Регистрация: 02.02.2013
Сообщений: 7
02.02.2013, 15:12  [ТС]     Перечисление Com портов #5
СуперСпасибо, будем разибартся))!
Cha1000000
0 / 0 / 1
Регистрация: 04.06.2015
Сообщений: 25
12.04.2016, 18:48     Перечисление Com портов #6
Добавлено через 5 часов 16 минут
Цитата Сообщение от raxp Посмотреть сообщение
Для сторонних разработчиков реализовал либу "Описание API вызова библиотеки GetNumCom.DLL".
Помогите разобраться с работой вашей либы в проекте С++.
Пробую сделать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
LPWSTR DLLname = L"GetNumCom.dll";
             HINSTANCE LibHandle = LoadLibrary(DLLname);
             if (LibHandle == NULL){ 
                 MessageBox::Show("Не удалось загрузить библиотеку GetNumCom.dll", "Ошибка!");
             }
 
             LPCSTR func_name = "gets";
             FARPROC getport = GetProcAddress(LibHandle, func_name);
             if (getport != 0)
             {
                 typedef void(__stdcall *GetPortName)(unsigned char *dev_name, unsigned char *numport, unsigned char[]);
                 //((GetPortName)getport)(parameters...);   вызов функции
             }
 
             FreeLibrary(LibHandle);
             LibHandle = NULL;
И вот не уверен, правильно ли я с синтаксиса Delphi на С++ параметры перевел в строке
C++
1
typedef void(__stdcall *GetPortName)(unsigned char *dev_name, unsigned char *numport, unsigned char[]);
Поправьте, если я где ошибся и если не затруднит, параллельно подскажите такую вещь... Я планирую в параметр dev_name передавать имя устройств из переменной типа String. Как мне её правильно (я имею в виду преобразование типов) туда передать? Заранее спасибо!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2016, 19:01     Перечисление Com портов
Еще ссылки по теме:

Перечисление enum C++
C++ Перечисление чисел
Перечисление в структуре C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Cha1000000
0 / 0 / 1
Регистрация: 04.06.2015
Сообщений: 25
14.04.2016, 19:01     Перечисление Com портов #7
Товарищи коллеги, вопрос тем, кто пользовался и разобрался с библиотекой getnumcom.dll
Пытаюсь воспользоваться ей на С++. Сделал вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
private: System::Void cbDevList_SelectedIndexChanged(System::Object^  sender, System::EventArgs^  e) {  // Обработка выбранного устройства
             String^ DevName = "";
             UCHAR port = '\0';
             unsigned char t[11] = { '\0' };
 
             if (cbDevList->SelectedIndex)
             {
                 DevName = cbDevList->SelectedItem->ToString();     // Записываем имя выбранного устройства в DevName
 
                 LPWSTR DLLname = L"GetNumCom.dll";     // загрузка модуля DLL
                 HINSTANCE LibHandle = LoadLibrary(DLLname);
                 if (LibHandle == NULL){
                     MessageBox::Show("Не удалось загрузить библиотеку GetNumCom.dll", "Ошибка!");
                 }
                 LPCSTR func_name = "gets";     // название загружаемой функции
                 FARPROC getport = GetProcAddress(LibHandle, func_name);
                 if (getport != 0)
                 {
                     typedef int(__stdcall *GetPortName)(unsigned char *dev_name, unsigned char *numport, unsigned char[]);
                     ((GetPortName)getport)((UCHAR*)&DevName, &port, t);
                 }
                 FreeLibrary(LibHandle);
                 LibHandle = NULL;
 
                 MessageBox::Show(Convert::ToString(port), "Попытка получить номер порта"); 
             }
}
Немного подробностей: в cbDevList у меня находится список наименований устройств, подключенных к ПК по USB. Из него беру имя выбираемого устройства и записываю в переменную String^ DevName, из которой потом передаю в качестве параметра в библиотечную функцию gets. По описанию и исходникам тестовой программы на Delphi, я понял, что если в качестве первого параметра передавать функции имя устройства, а второй оставлять пустым, то в этот второй она должна возвращать номер порта. Однако, выбирая различные устройства из списка все время получаю только значение 0.
Кто знает в чем может быть дело, сообщите пожалуйста!
Yandex
Объявления
14.04.2016, 19:01     Перечисление Com портов
Ответ Создать тему
Опции темы

Текущее время: 04:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru