MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #30 : 29-06-2004 08:35 » |
|
MOPO3, Слушай я что-то не вижу .... Она у тебя наверно тут висит:
WaitForSingleObject(OL.hEvent, INFINITE);
Если так, то ставь время поменьше и прверяй переданные байты и решай оборвать или нет только проверяй WaitForSingleObject(OL.hEvent, 1000); на TIME_OUT
время задержки выбери согласно твоим условиям (скорости железа и тд) Да, висит именно на WaitForSingleObject(OL.hEvent, INFINITE); Ок, попробую с таймаутом поиграться.
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #31 : 30-06-2004 05:30 » |
|
MOPO3, я думал что есть какие либо решения которые показывают то , что прописано в режистри. Если порт открыт, соответственно получим INVALID_HANDLE_VALUE, а хотелось бы и его увидеть в списке Вот как вывести порты даже если получим INVALID_HANDLE_VALUE : String comm_port; for(int i = 1; i < 255; i++) { comm_port = "\\\\.\\COM" + IntToStr(i);
hComm_test = CreateFile(comm_port.c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0); if(hComm_test == INVALID_HANDLE_VALUE) { DWORD dwError = GetLastError(); if(dwError == ERROR_ACCESS_DENIED || dwError == ERROR_GEN_FAILURE) { ComPort->Items->Add("COM" + IntToStr(i)); } CloseHandle(hComm_test); } else { ComPort->Items->Add("COM" + IntToStr(i)); CloseHandle(hComm_test); } }
Во как и не надо в реджистри лезть
|
|
« Последнее редактирование: 28-11-2007 18:54 от Алексей1153++ »
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #32 : 30-06-2004 11:18 » |
|
MOPO3, Я думаю это зависит от задачи. Ведь если один СОМ уже занят, то он тебе не будет показан, хотя он существует. Этот метод хорош для свободных портов.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "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."
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #33 : 30-06-2004 11:23 » |
|
Джон, будет показан даже занятый порт Я уже проверил Покажет после обработки вот этого блока if(dwError == ERROR_ACCESS_DENIED || dwError == ERROR_GEN_FAILURE) { ComPort->Items->Add("COM" + IntToStr(i)); }
|
|
« Последнее редактирование: 28-11-2007 18:56 от Алексей1153++ »
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #34 : 30-06-2004 12:16 » |
|
MOPO3, Сорри :oops: Не увидел. "Галопом по европам." Но с другой стороны, а если он в самом деле ERROR_GEN_FAILURE, можно ли говорить о существовании этого порта? :l_smile:
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "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."
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #35 : 30-06-2004 12:23 » |
|
Джон, тогда правильнее будет проверять только ERROR_ACCESS_DENIED. Думаю что это выдаётся только для существующих портов ИМХО.
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
Scorpion
Гость
|
|
« Ответ #36 : 24-03-2009 18:43 » |
|
Прошло много лет... Реализовал я идею МОРОЗ'а. Скажу только что я часто работаю с разными шнурками USB-COM. Которые в системе создают виртуальный COM-порт. Дырок USB в компе много, один и тот же шнурок можно воткнуть в разные дырки - получаться разные виртуальные COM-порты. И вот набралось у меня этих виртуальных компортов в системе немало. Поскольку многие программы умеют работать только с псевдонимами (COM1..COM8) то приходилось в свойствах драйвера устанавливать COM13 -> COM5 (например) и говорить что так и надо. В итоге - множество записей в реестре о когда либо воткнутых в компутер шнурках как о COM портах : SYSTEM\CurrentControlSet\Enum\FTDIBUS\VID_0403+PID_6001+A4004WiIA\0000\\Device Parameters COM5 - USB Serial Port (COM5) FTSER2K
SYSTEM\CurrentControlSet\Enum\FTDIBUS\VID_0403+PID_6001+A9004FJTA\0000\\Device Parameters COM13 - USB Serial Port (COM13) FTSER2K
SYSTEM\CurrentControlSet\Enum\FTDIBUS\VID_0403+PID_6001+A9004FQHA\0000\\Device Parameters COM5 - USB Serial Port (COM5) FTSER2K
SYSTEM\CurrentControlSet\Enum\FTDIBUS\VID_0403+PID_6001+ftDGUR6QA\0000\\Device Parameters COM2 - USB Serial Port (COM2) FTSER2K
SYSTEM\CurrentControlSet\Enum\FTDIBUS\VID_0403+PID_6001+ftDHIXHUA\0000\\Device Parameters COM6 - USB Serial Port (COM6) FTSER2K
SYSTEM\CurrentControlSet\Enum\NMWCD\VID_0421&PID_04f9&IF_JAVACOMM\7&ff26118&0&09\\Device Parameters COM12 - Nokia 6300 USB (COM12) usbser
SYSTEM\CurrentControlSet\Enum\umpport\com\6&501705c&0&0000\\Device Parameters COM4 - MSP-FET430UIF - Serial Port (COM4) umpusbxp
SYSTEM\CurrentControlSet\Enum\USB\Vid_067b&Pid_2303\5&3512b308&0&1\\Device Parameters COM5 - DCU-11 USB-to-Serial Bridge (COM5) Ser2pl
SYSTEM\CurrentControlSet\Enum\USB\Vid_067b&Pid_2303\5&3512b308&0&2\\Device Parameters COM7 - DCU-11 USB-to-Serial Bridge (COM7) Ser2pl
SYSTEM\CurrentControlSet\Enum\USB\Vid_067b&Pid_2303\5&63ec2dd&0&1\\Device Parameters COM7 - DCU-11 USB-to-Serial Bridge (COM7) Ser2pl
SYSTEM\CurrentControlSet\Enum\USB\Vid_067b&Pid_2303\5&63ec2dd&0&2\\Device Parameters COM4 - DCU-11 USB-to-Serial Bridge (COM4) Ser2pl
SYSTEM\CurrentControlSet\Enum\USB\Vid_067b&Pid_2303\6&337a5645&0&4\\Device Parameters COM7 - DCU-11 USB-to-Serial Bridge (COM7) Ser2pl
SYSTEM\CurrentControlSet\Enum\USB\Vid_0e55&Pid_110b\5&3512b308&0&1\\Device Parameters COM7 - MS3303H USB-to-Serial Bridge (COM7) Ser2pl
SYSTEM\CurrentControlSet\Enum\USB\Vid_0e55&Pid_110b\5&3512b308&0&2\\Device Parameters COM6 - MS3303H USB-to-Serial Bridge (COM6) Ser2pl
SYSTEM\CurrentControlSet\Enum\USB\Vid_4348&Pid_5523\5&3512b308&0&1\\Device Parameters COM8 - USB-SERIAL CH340 (COM8) CH341SER
SYSTEM\CurrentControlSet\Enum\USB\Vid_4348&Pid_5523\5&3512b308&0&2\\Device Parameters COM2 - USB-SERIAL CH340 (COM2) CH341SER
SYSTEM\CurrentControlSet\Enum\USB\Vid_4348&Pid_5523\5&63ec2dd&0&1\\Device Parameters COM2 - USB-SERIAL CH340 (COM2) CH341SER
SYSTEM\CurrentControlSet\Enum\USB\Vid_4348&Pid_5523\5&63ec2dd&0&2\\Device Parameters COM7 - USB-SERIAL CH340 (COM7) CH341SER
SYSTEM\CurrentControlSet\Enum\USB\Vid_4348&Pid_5523\6&337a5645&0&2\\Device Parameters COM8 - USB-SERIAL CH340 (COM8) CH341SER
SYSTEM\CurrentControlSet\Enum\USB\Vid_4348&Pid_5523\6&a993ce3&0&2\\Device Parameters COM8 - USB-SERIAL CH340 (COM8) CH341SER
SYSTEM\CurrentControlSet\Enum\USB\Vid_4348&Pid_5523\6&a993ce3&0&4\\Device Parameters COM6 - USB-SERIAL CH340 (COM6) CH341SER
SYSTEM\CurrentControlSet\Enum\USB\Vid_6547&Pid_0232\5&3512b308&0&1\\Device Parameters COM6 - USB Data Cable (COM6) usb2vcom
SYSTEM\CurrentControlSet\Enum\USB\Vid_6547&Pid_0232\5&3512b308&0&2\\Device Parameters COM3 - USB Data Cable (COM3) usb2vcom
SYSTEM\CurrentControlSet\Enum\USB\Vid_6547&Pid_0232\6&a993ce3&0&4\\Device Parameters COM10 - USB Data Cable (COM10) usb2vcom [/tt] Кстати, в список попадает так же LPT1 порт, так как для него ClassName == "Ports" а также ClassGUID тот же что и для последовательных портов. Как их различить ? Получается не очень красиво: Ну а хочется то видеть собственно т.е. реально присутствующие в системе порты. Сразу попрошу не предлагать пытаться открывать найденные в реестре порты, так как хотелось бы видеть в описании порта "FriendlyName" актуальную подпись ! Может быть в реестре делается пометка что это устройство сейчас подключено ? Как такого добиться ?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #37 : 24-03-2009 20:12 » |
|
Scorpion, я вот такой код себе написал, переделай по своему вкусу ) //получить список COM-портов в системе void CRegWork2::st_EnumCOMports( CStringArray& csaCOMzList, bool bClearListBeforeWork, CComboBox* const pcbx, const CStringArray* const p_csaCOMzList_dontTouchComboIfNewListEqualToThis, bool* pbWasCha ) { if(pbWasCha)*pbWasCha=false; CRegWork2 rw2; if(rw2.OpenKeyIn_HKEY_LOCAL_MACHINE("HARDWARE\\DEVICEMAP\\SERIALCOMM")) { if(bClearListBeforeWork)csaCOMzList.RemoveAll();
LONG res; char currParName[MAX_PATH+1]; memset(currParName,0,sizeof(currParName)); DWORD dwdNameLenToUse=0;
BYTE currCOMName[100+1]; memset(currCOMName,0,sizeof(currCOMName)); DWORD dwdcurrCOMnameLen=0;
DWORD dwdType=REG_SZ;
CString csTemp; for(DWORD dwd=0;;dwd++) { dwdNameLenToUse=sizeof(currParName)-1; dwdcurrCOMnameLen=sizeof(currCOMName)-1; res=RegEnumValue(rw2.GetHKEY(),dwd,currParName,&dwdNameLenToUse,0,&dwdType,currCOMName,&dwdcurrCOMnameLen);
if(res!=ERROR_SUCCESS)break;
if(dwdcurrCOMnameLen && dwdcurrCOMnameLen<=sizeof(currCOMName)-1) { currCOMName[dwdcurrCOMnameLen]=0; csaCOMzList.Add(currCOMName);
//сортируем по возрастанию if(csaCOMzList.GetSize()>1) { int i; for(i=csaCOMzList.GetSize()-1; i>=1; i--) { if(csaCOMzList[i]>=csaCOMzList[i-1])break;
csTemp=csaCOMzList[i]; csaCOMzList[i]=csaCOMzList[i-1]; csaCOMzList[i-1]=csTemp; } } } } }
//определяем похожесть на предыдущий список bool bIsLikeTo=true; if(!p_csaCOMzList_dontTouchComboIfNewListEqualToThis) { bIsLikeTo=false; } else { if(p_csaCOMzList_dontTouchComboIfNewListEqualToThis->GetSize()!=csaCOMzList.GetSize()) { bIsLikeTo=false; } else { //размеры списков равны int i; for(i=0; i<csaCOMzList.GetSize(); i++) { if(csaCOMzList[i]!=(*p_csaCOMzList_dontTouchComboIfNewListEqualToThis)[i]) { bIsLikeTo=false; break; } } } }
//csaCOMzList - отсортирован по возрастанию
if(pcbx && !bIsLikeTo) { if(pbWasCha)*pbWasCha=true;
pcbx->ResetContent();
//компорты int i; for(i=0;i<csaCOMzList.GetSize();i++) { pcbx->AddString(csaCOMzList[i]); } } }
|
|
|
Записан
|
|
|
|
Scorpion
Гость
|
|
« Ответ #38 : 24-03-2009 21:01 » |
|
Дружище, ты бы мне идею саму подсказал ! Ладно, завтра на свежу голову покурю твой код....
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #39 : 24-03-2009 21:11 » |
|
ммм, наверное я что то не понял. Скажи в двух словах - в чём проблема основная заключается ?
1) список комов получить 2) отличить USB железки одна от другой
?
|
|
|
Записан
|
|
|
|
Scorpion
Гость
|
|
« Ответ #40 : 25-03-2009 14:29 » |
|
Думал что описал все крайне подробно, но кажись переборщил - кто же осилит скока букав ! Попытаюсь в двух словах:
Метод МОРОЗа вытаскивает из реестра все СОМ порты когда либо установленные в системе (даже если девайс вытащили то COM порты остались жить в реестре)
Мне нужно получить список РЕАЛЬНО ПРИСУТСТВУЮЩИХ портов в системе, так как показывает Диспетчер Устройств. Тупой перебор не катит так как не дает описания порта.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #41 : 25-03-2009 17:38 » |
|
Scorpion, мой код как раз для твоей задачи. Только он использует MFC+API, но если нужно, всё легко перекладывается чисто на АПИ )
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #42 : 25-03-2009 17:49 » |
|
Scorpion, смотри в сторону 2-х вариантов: 1. Используя API-функции SetupDiCreateDeviceInfoList, SetupDiGetClassDevsEx, SetupDiEnumDeviceInfo получить список оборудования определенного класса, в данном случае COM-порты. 2. Используя WMI получить список последовательных портов. В msdn есть пример, правда на VB: strComputer = "." Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" _ & strComputer & "\root\cimv2") Set colSMBIOS = objWMIService.ExecQuery _ ("Select * from Win32_SystemEnclosure") For Each objSMBIOS in colSMBIOS Wscript.Echo "Part Number: " & objSMBIOS.PartNumber Wscript.Echo "Serial Number: " _ & objSMBIOS.SerialNumber Wscript.Echo "Asset Tag: " _ & objSMBIOS.SMBIOSAssetTag Next
А вот для USB: strComputer = "." Set objWMIService = GetObject(_ "winmgmts:\\" & strComputer & "\root\cimv2") Set colItems = objWMIService.ExecQuery( _ "Select * from Win32_USBHub") For Each objItem in colItems Wscript.Echo "Device ID: " & objItem.DeviceID Wscript.Echo "PNP Device ID: " _ & objItem.PNPDeviceID Wscript.Echo "Description: " _ & objItem.Description Wscript.Echo Next
|
|
|
Записан
|
|
|
|
Scorpion
Гость
|
|
« Ответ #43 : 27-03-2009 09:36 » |
|
zubr, Мне нравится первый вариант. Но у меня не получается использовать setupapi.h При создании консольного проекта #include <setupapi.h> #include <stdio.h>
void main(){ printf("Hello world\n"); } компилятор выдает ошибку: Error 1 error C2143: syntax error : missing ';' before '*' c:\program files\microsoft visual studio 8\vc\platformsdk\include\setupapi.h 56 Error 2 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\program files\microsoft visual studio 8\vc\platformsdk\include\setupapi.h 56 Error 3 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\program files\microsoft visual studio 8\vc\platformsdk\include\setupapi.h 56
переходим на строку 56 в setupapi.h : 54:#ifndef __LPGUID_DEFINED__ 55:#define __LPGUID_DEFINED__ 56:typedef GUID *LPGUID; 57:#endif
сама setupapi.dll на компе есть. Может нужно что то (доо/перо)пределить ? Если имеете примерчик, бросьте пожалуйста !
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #44 : 30-03-2009 12:49 » |
|
Попробуй самой верхней подключить windows.h.
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #45 : 30-03-2009 15:13 » |
|
Scorpion, пример могу дать, но только на Delphi.
|
|
|
Записан
|
|
|
|
|