请教下,我用VC6.0编写的软件使用的串口通信,每次安装后都需要将电脑的上COM口和软件里的COM口改成一致,才能使用USB转串口的数据线实现通信。我想实现软件自动识别电脑当前是在占用那个COM口, 这样该如何实现呢?

解决方案 »

  1.   

    枚举串口 一个一个open  
    open失败的就是被占用
      

  2.   

    查注册表。
    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);
    }
      

  3.   

    枚举串口 一个一个open   
    open失败的就是被占用 
      

  4.   

    通过open失败来判断就是被占用,这个方法不太可靠,得有前提,就是计算机上只能有一个串口,或者有多个串口,但其它的串口都被打开,只有一个未被打开,同时这个未被打开的正好就是和你的下位机连接的.
      

  5.   

    查询USB总线~
    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;
    }
    }
      

  6.   

    方法很多
    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); //关闭注册表
    ////////////////////////////////////////////////////////
      

  7.   

    看看这篇文章会不会对你有帮助
    http://blog.csdn.net/xianglitian/article/details/7186455