: 我的異常網(wǎng) ? VC/MFC ? VC++ 怎么實現(xiàn)自動查找連接電腦COM口 VC++ 怎么實現(xiàn)自動查找連接電腦COM口 www.MyException.Cn 發(fā)布于:2012-05-27 05:42:30 瀏覽:283次 請教下,我用VC6.0編寫的軟件使用的串口通信,每次安裝后都需要將電腦的上COM口和軟件里的COM口改成一致,才能使用USB轉(zhuǎn)串口的數(shù)據(jù)線實現(xiàn)通信。我想實現(xiàn)軟件自動識別電腦當前是在占用那個COM口, 這樣該如何實現(xiàn)呢? ------解決方案-------------------- 查注冊表。 HKEY hKey; if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"HARDWARE\\DEVICEMAP\\SERIALCOMM",NULL,KEY_ALL_ACCESS,&hKey)==ERROR_SUCCESS)//打開注冊表成功 { //while(ERROR_SUCCESS==::RegEnumValue( DWORD idx, lenName = 100, dwType; idx = 0; char valName[100]; memset(valName,'\0',sizeof(valName)); while (RegEnumValue(hKey, // 讀取hkey 的所有子鍵 idx++, (LPSTR)valName, &lenName, NULL, &dwType, NULL, NULL) != ERROR_NO_MORE_ITEMS) { CString strSub=valName; //子鍵名 BYTE strCom[80]; //子鍵值 memset(strCom,0,80); DWORD type=REG_SZ, cbData=80; //子鍵類型字符串 if(RegQueryValueEx(hKey, strSub, NULL,&type,strCom, &cbData)==ERROR_SUCCESS)//讀取子鍵值 { this->m_cmb.InsertString(m_cmb.GetCount(),(LPCTSTR)strCom);//添加串口名到列表 } memset(valName,0,sizeof(valName)); lenName = 100; // 這里是關鍵,因為每次循環(huán)lenName的值都會被RegEnumValue更改, } } else { MessageBox("查詢串口失??!","提示",MB_ICONERROR); } ------解決方案-------------------- 方法很多 1:你可以自己寫個枚舉函數(shù)枚舉所有的口,如果可以打開,則發(fā)送命令下去,返回正常則是你要的設備,關閉枚舉。 2:可以通過打開注冊表來獲取已插入的串口號,然后發(fā)送命令進行匹配,注冊表獲取串口號方法如下:
//////////////從注冊表中讀取用戶的串口信息///////// HKEY hKEY; LPCTSTR data_Set="HARDWARE\\DEVICEMAP\\SERIALCOMM"; if(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_Set, 0, KEY_READ, &hKEY)) //打開注冊表 { AfxMessageBox("注冊表錯誤: 無法打開有關的hKEY!"); return; } long i; LPBYTE Data_Get=new BYTE [10]; for (i=0; ;i++) //中間為空,沒有進行i值的比較 { TCHAR szValueName[_MAX_PATH + 1]; DWORD dwValueName = sizeof(szValueName); LPDWORD lpType = 0; DWORD cbData = 10; long ret = (RegEnumValue(hKEY,i,szValueName,&dwValueName, NULL,lpType,Data_Get,&cbData)); if (ret) break; for (int j=0; j<10; j++) { strPort[i].Format(_T("%s"),Data_Get); } Port_Num = i+1; } delete[] Data_Get; ::RegCloseKey(hKEY); //關閉注冊表 //////////////////////////////////////////////////////// |
|
來自: 筱肆 > 《網(wǎng)文收藏》