获取设备管理器中的串口(COMx)

文章展示了如何通过C++遍历Windows设备映射中的SerialComm注册表,获取可用串口号,并尝试打开这些串口。
摘要由CSDN通过智能技术生成

#include <stdio.h>
#include <string>
#include <vector>
#include <algorithm>
#include <Windows.h>
#include <tchar.h>
#include <iostream>

using namespace std;

void GetComList_Reg(std::vector<string>& comList)
{
    HKEY hkey;
    int result;
    int i = 0;

    result = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
        _T("Hardware\\DeviceMap\\SerialComm"),
        NULL,
        KEY_READ,
        &hkey);

    if (ERROR_SUCCESS == result)   //   打开串口注册表   
    {
        TCHAR portName[0x100], commName[0x100];
        DWORD dwLong, dwSize;
        do
        {
            dwSize = sizeof(portName) / sizeof(TCHAR);
            dwLong = dwSize;
            result = RegEnumValue(hkey, i, portName, &dwLong, NULL, NULL, (LPBYTE)commName, &dwSize);
            if (ERROR_NO_MORE_ITEMS == result)
            {
                //   枚举串口
                break;   //   commName就是串口名字"COM4"
            }
            string m_str = "";
            for (int j = 0; commName[j] != '\0'; j++)
            {
                m_str.push_back((char)commName[j]);
            }
            comList.push_back(m_str);
            i++;
        } while (1);

        RegCloseKey(hkey);
    }
}

//一下代码打开串口

vector<string> comList;
    CString strComOpen;
    int sum = 0;
    int comNum;
    CString m_cstr;
    GetComList_Reg(comList);
    comNum = (int)comList.size();
    if (comNum > 0)
    {
        for (int i = 0; i < comNum; i++)
        {
            m_cstr = comList[i].c_str();
            strComOpen = TEXT("\\\\.\\") + m_cstr;    //需要打开的串口
            AfxMessageBox(strComOpen);

            hCom = CreateFile(strComOpen, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);//如果返回不为空则此串口可用
            if (INVALID_HANDLE_VALUE != hCom)
            {
                m_cstr.Append(_T(" is opened!"));
                AfxMessageBox(m_cstr);
                sum++;
                //            CloseHandle(hCom);
                //            hCom = INVALID_HANDLE_VALUE;
            }
            else DWORD error = ::GetLastError();//取得错误信息        
        }
    }
    else
    {
        AfxMessageBox(_T("No COM Available!"));
    }

//

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值