搜索
bottom↓
回复: 8

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

[复制链接]

出0入0汤圆

发表于 2012-5-3 14:23:13 | 显示全部楼层 |阅读模式
有些串口工具不能自动识别系统可用的串口,而是列出了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[_MAX_PATH];                                //键值名称
        DWORD nValueNameSize = _MAX_PATH;                //键值名称长度
        DWORD ValueType;                                                //键值类型
        BYTE bValueData[_MAX_PATH];                                //键值数值
        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正好是选择串口号常用的控件类型,所以用起来很方便。

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2012-5-3 14:25:11 | 显示全部楼层
当然把返回值修改成可用的串口数也是不错的主意。。。

出0入0汤圆

发表于 2012-5-3 15:03:02 | 显示全部楼层
时间久了你就会发现你这个并不可靠.不过总算比COM1-COMXX瞎填好.

出0入0汤圆

发表于 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);                              //返回有效串口数
}

出0入0汤圆

发表于 2012-5-7 16:55:03 | 显示全部楼层
好用,谢谢。!

出0入0汤圆

发表于 2012-5-7 17:00:14 | 显示全部楼层
都不好用,直接使用类库的静态方法getPortName()直接返回可用的串口端口名数组~

出0入0汤圆

发表于 2012-5-7 17:15:28 | 显示全部楼层
nongxiaoming 发表于 2012-5-7 17:00
都不好用,直接使用类库的静态方法getPortName()直接返回可用的串口端口名数组~ ...

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

出0入0汤圆

发表于 2012-5-7 17:52:24 | 显示全部楼层
raohao101 发表于 2012-5-7 17:15
怎么实现??楼主的方法我觉得还可以啊,请赐教!

库里面直接有的静态方法

出0入0汤圆

发表于 2012-6-21 16:56:06 | 显示全部楼层
没明白楼上说的静态方式是啥?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-1 19:47

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表