分享

VC++ 怎么实现自动查找连接电脑COM口

 筱肆 2013-12-18
: 我的异常网VC/MFC ? VC++ 怎么实现自动查找连接电脑COM口

VC++ 怎么实现自动查找连接电脑COM口

www.MyException.Cn   发布于:2012-05-27 05:42:30   浏览:283次
VC++ 如何实现自动查找连接电脑COM口
请教下,我用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:可以通过打开注册表来获取已插入的串口号,然后发送命令进行匹配,注册表获取串口号方法如下:
C/C++ code
    //////////////从注册表中读取用户的串口信息/////////
    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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多