VC60串口枚举实例:设备管理器扫描方法、读取注册表方法、CreateFile方法

介绍三种方法获取串口列表,直接上代码,可以通过链接下载到调通的程序,0积分下载

https://download.csdn.net/download/hyhsandy1803/87126614

第一种方法可以获取到完整的串口名称,方便用户识别选择

第二种方法只能识别到COMx

第三种方法也只能识别到COMx,并且因为需要遍历,时间会比较久,但是也有好处,不可用的串口(如已经被连接打开)可以识别出来。

这里只是举个例子,可以结合以上1和2方法,提升效率,又能获取完整

 

	#include <devguid.h>
    #include "setupapi.h"
    #pragma comment(lib,"setupapi")
   //第一种方法要加这几个头文件
    

   //通过设备管理器获取串口列表

	DWORD   i;
	char    szBuf[256] = { 0 };
	char   FriendlyName[256] = { 0 };
	
	//构建系统存在的所有设备列表
	HDEVINFO hDevInfo = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_PRESENT|DIGCF_ALLCLASSES); 
	if (hDevInfo == INVALID_HANDLE_VALUE)
	{
		return;
	};
	
	SP_DEVINFO_DATA SpDevInfoData = { 0 };
	SpDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
	for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &SpDevInfoData); i++)	
	{
		
		if (!SetupDiGetDeviceRegistryProperty(hDevInfo, &SpDevInfoData, SPDRP_CLASS, NULL, (PBYTE)szBuf, sizeof(szBuf), 0))
		{
			continue;
		}
		else
		{		
			if (strcmp(szBuf, "Ports") != 0) //过滤端口
			{
				continue;
			}
		}
		
		if (SetupDiGetDeviceRegistryProperty(hDevInfo, &SpDevInfoData, SPDRP_FRIENDLYNAME, NULL, (PBYTE) FriendlyName, sizeof(FriendlyName), 0))
		{
			//char *p;
			//p=strrchr(FriendlyName,'(');	
			StrTemp.Format("Devguid Find COM:FriendlyName=%s\r\n",FriendlyName);
			m_Info=m_Info+StrTemp;
			TRACE("Devguid Find COM:FriendlyName=%s\n",FriendlyName);
		}
	}
 
	if(hDevInfo)
		SetupDiDestroyDeviceInfoList(hDevInfo); //释放资源

	
	
	//通过注册表获取串口列表
	HKEY hKey;
	DWORD dwIndex=0;         // index of value to query
	char ValueName[255];    // address of buffer for value string
	DWORD cbValueName=255;  // address for size of value buffer	
	DWORD Type=REG_SZ;  //指明数据类型
	BYTE Data[255];          // address of buffer for value data
	DWORD cbData=255;       // address for size of data buffer

	int ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\SERIALCOMM", 0, KEY_EXECUTE, &hKey);
	if (ret != ERROR_SUCCESS)
	{
		TRACE("打开注册表失败\n");
		return ;
	}
	
	while((ret=RegEnumValue(hKey,dwIndex,ValueName,&cbValueName,NULL,&Type,Data,&cbData))!= ERROR_NO_MORE_ITEMS)
	{
		
		StrTemp.Format("Regedit Find COM:dwIndex=%d ValueName=%s  cbValueName=%d Data=%s cbData=%d\r\n", dwIndex,ValueName,cbValueName,Data,cbData);
		m_Info=m_Info+StrTemp;
		TRACE("Regedit Find COM:dwIndex=%d ValueName=%s  cbValueName=%d Data=%s cbData=%d\n", dwIndex,ValueName,cbValueName,Data,cbData);
		dwIndex++;//索引 +1,准备取下一个值
		cbValueName=255; //恢复原来大小
		cbData=255;	
	}
	
	RegCloseKey(hKey);


	
	//通过CreateFile获取串口列表

	HANDLE hCom;
	CString str;	
	for(i=1;i<=16;i++)
	{
		str.Format(_T("COM%d"),i);
		hCom = CreateFile(str, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);	
		if (hCom == INVALID_HANDLE_VALUE)
		{
			
			continue;
		}
		else
		{
			StrTemp.Format("CreateFile Find COM:%s\r\n",str);
			m_Info=m_Info+StrTemp;
			TRACE("CreateFile Find COM:%s\n",str);
			
		}
		if (!(hCom==INVALID_HANDLE_VALUE))
		{
			CloseHandle(hCom);
		}		
	}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hyhsandy1803

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值