获取本机串口列表

#include <map>
#include <string>
#include <tchar.h>
#include <windows.h>

#ifdef UNICODE
#define _tstring		std::wstring
#else
#define _tstring		std::string
#endif

// 串口信息
typedef struct _COMM_INFO
{
	_tstring	strName;
	_tstring	strPath;
	_tstring	strValueName;
	int			commNumber;

	_COMM_INFO() : commNumber(0) {}

}COMM_INFO;

// 获取系统中串口列表
std::map<int, COMM_INFO> GetSerialsList()
{
	std::map<int, COMM_INFO> mapResult;
	HKEY hKey = NULL;
	LSTATUS nStatus = ERROR_SUCCESS;

	nStatus = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Hardware\\DeviceMap\\SerialComm"), NULL, KEY_READ, &hKey);
	if (nStatus == ERROR_SUCCESS)
	{
		TCHAR szValueName[MAX_PATH];
		TCHAR szTypeName[MAX_PATH];
		TCHAR szPortData[MAX_PATH];
		DWORD dwCchValueName = 0;
		DWORD dwCbData;
		DWORD dwIndex = 0;

		while (true)
		{
			dwCchValueName = _countof(szValueName);
			dwCbData = sizeof(szPortData);
			nStatus = ::RegEnumValue(hKey, dwIndex, szValueName, &dwCchValueName, NULL, NULL, (PUCHAR)szPortData, &dwCbData);
			if (ERROR_NO_MORE_ITEMS == nStatus)
			{
				break;
			}
			else
			{
				int commNumber = 0;
				if (1 == _stscanf_s(szPortData, _T("COM%d"), &commNumber))
				{
					COMM_INFO info;
					info.commNumber = commNumber;
					info.strValueName = szValueName;
					info.strName = szPortData;
					info.strPath = _T(R"(\\.\)");
					info.strPath += szPortData;
					mapResult.insert(std::make_pair(commNumber, info));
				}
			}

			dwIndex++;
		}

		::RegCloseKey(hKey);
	}

	return mapResult;
}

int main()
{
	std::map<int, COMM_INFO> mapResult = GetSerialsList();
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值