jujiaqi 发表于 2012-5-3 14:23:13

发个枚举windows系统可用串口的函数

有些串口工具不能自动识别系统可用的串口,而是列出了1到n等若干个串口号,用起来很不方面。一个人性化的软件,应该尽量给用户提供方便,比如用户可选的串口必须是系统可用的。这个函数就是实现这个功能的:

//枚举串口
BOOL EnumPort(CComboBox * CmboBoxPort)
{
        HKEY hKey = NULL;

        long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Hardware\\DeviceMap\\SerialComm",0,KEY_READ,&hKey);        //打开注册表
        if( lRet != ERROR_SUCCESS )
        {
                return FALSE;                                                //系统不存在串口
        }

        DWORD i = 0;                                                        //键值序号
        char cValueName;                                //键值名称
        DWORD nValueNameSize = _MAX_PATH;                //键值名称长度
        DWORD ValueType;                                                //键值类型
        BYTE bValueData;                                //键值数值
        DWORD nValueDataSize = _MAX_PATH;                //键值数值长度
        do
        {
                nValueNameSize = _MAX_PATH;                        //重置键值名称长度
                nValueDataSize = _MAX_PATH;                        //重置键值数值长度

                lRet = RegEnumValue(hKey, i, cValueName, &nValueNameSize, 0, &ValueType, bValueData, &nValueDataSize);        //枚举键值
                if(lRet == ERROR_SUCCESS)
                {
                        CmboBoxPort->AddString((LPCTSTR)bValueData);        //将串口号添加至组合框的列表中
                }
                i++;
        }while(lRet == ERROR_SUCCESS);                                                        //读取完毕后退出循环

        return (i) ? TRUE : FALSE;
}

这个函数执行完后,如果返回FALSE表示系统没有串口,如果返回TRUE表示至少有一个串口,并且会将系统可用的串口保存在CComboBox 中,而CComboBox正好是选择串口号常用的控件类型,所以用起来很方便。

jujiaqi 发表于 2012-5-3 14:25:11

当然把返回值修改成可用的串口数也是不错的主意。。。

dragon_hn 发表于 2012-5-3 15:03:02

时间久了你就会发现你这个并不可靠.不过总算比COM1-COMXX瞎填好.

lantian0099 发表于 2012-5-7 00:09:28

我是直接尝试打开,成功了就算检测到了,可能会比较慢? 呵呵~我也发个,MFC的...

==========================================================================
int ComPortReflash(CComboBox * pComboComPort)
{
    /*---------------------------------------------------------------------------------------------
   *打开串口,从COM1到COM64
   *-------------------------------------------------------------------------------------------*/
   int intComNum = 0;                                                   //可用串口数
        CString strComPort,strComPortCmd;                  //串口号,串口命令
        pComboComPort->ResetContent();                  //清除ComboBox中内容
        for (int i = 1; i < 64; i ++)
        {
                strComPort.Format("COM%d",i);          //串口号,用于添加到ComboBox中
                strComPortCmd.Format("\\\\.\\COM%d",i);//对应串口号的打开方式
                HANDLE hCOM = CreateFile(strComPortCmd, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
                if (hCOM != INVALID_HANDLE_VALUE) //打开成功
                {
                        intComNum ++;         //可用串口数+1
                        pComboComPort->AddString(strComPort); //添加串口号到ComboBox
                        CloseHandle(hCOM);    //关闭串口
                }
        }

        pComboComPort->SetCurSel(0);                  //选择第一个

        return (intComNum);                              //返回有效串口数
}

raohao101 发表于 2012-5-7 16:55:03

好用,谢谢。!

nongxiaoming 发表于 2012-5-7 17:00:14

都不好用,直接使用类库的静态方法getPortName()直接返回可用的串口端口名数组~

raohao101 发表于 2012-5-7 17:15:28

nongxiaoming 发表于 2012-5-7 17:00 static/image/common/back.gif
都不好用,直接使用类库的静态方法getPortName()直接返回可用的串口端口名数组~ ...

怎么实现??楼主的方法我觉得还可以啊,请赐教!

nongxiaoming 发表于 2012-5-7 17:52:24

raohao101 发表于 2012-5-7 17:15 static/image/common/back.gif
怎么实现??楼主的方法我觉得还可以啊,请赐教!

库里面直接有的静态方法

afei8856 发表于 2012-6-21 16:56:06

没明白楼上说的静态方式是啥?
页: [1]
查看完整版本: 发个枚举windows系统可用串口的函数