请教下,我用VC6.0编写的软件使用的串口通信,每次安装后都需要将电脑的上COM口和软件里的COM口改成一致,才能使用USB转串口的数据线实现通信。我想实现软件自动识别电脑当前是在占用那个COM口, 这样该如何实现呢?
解决方案 »
- 如何获得已知句柄的ListCtrl控件中的值类?
- 在对话框上根据设置最多显示36个窗口在实现中遇到问题,请指点
- 请教一个小问题关于GetQueuedCompletionStatus参数BytesTransferred的小问题
- 程序运行过程出现“f:\capfile\11866572\capfile.avi中包含无效路径”请问是何缘故,如何解决?
- 呵呵,升星散分
- 能否在ACCEPT之前,得到对方的端口号?
- 如何加入一个dll动态链接库?紧急求助!
- VC转成DelPhi?
- 急!!!!!!!!!!一个关于LOGFONT结构的简单问题!!!
- 如何获取假定服务器的名字及端口号?
- 高手请进
- MFC中对BMP图像放大缩小
open失败的就是被占用
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);
}
open失败的就是被占用
if(message == WM_DEVICECHANGE)
{
if(DBT_DEVICEARRIVAL==wParam)
{
PDEV_BROADCAST_HDR pDevBroadcastHdr;
PDEV_BROADCAST_PORT pDevPort; pDevBroadcastHdr = (PDEV_BROADCAST_HDR) lParam;
pDevPort = (PDEV_BROADCAST_PORT)pDevBroadcastHdr;
if(pDevBroadcastHdr->dbch_devicetype == DBT_DEVTYP_PORT)
{
flag = OpenPort((short)_tcstoul((pDevPort->dbcp_name)+3,NULL,10),1);
}
return TRUE;
}
}
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); //关闭注册表
////////////////////////////////////////////////////////
http://blog.csdn.net/xianglitian/article/details/7186455