VC++ 怎么实现自动查找连接电脑COM口 www.MyException.Cn 发布于:2012-05-27 05:42:30 浏览:283次 请教下,我用VC6.0编写的软件使用的串口通信,每次安装后都需要将电脑的上COM口和软件里的COM口改成一致,才能使用USB转串口的数据线实现通信。我想实现软件自动识别电脑当前是在占用那个COM口, 这样该如何实现呢? ------解决方案-------------------- 查注册表。 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; // 这里是关键,因为每次循环lenName的值都会被RegEnumValue更改, } } else { MessageBox("查询串口失败!","提示",MB_ICONERROR); } ------解决方案-------------------- 方法很多 1:你可以自己写个枚举函数枚举所有的口,如果可以打开,则发送命令下去,返回正常则是你要的设备,关闭枚举。 2:可以通过打开注册表来获取已插入的串口号,然后发送命令进行匹配,注册表获取串口号方法如下:
//////////////从注册表中读取用户的串口信息///////// 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); //关闭注册表 //////////////////////////////////////////////////////// |
|