介绍三种方法获取串口列表,直接上代码,可以通过链接下载到调通的程序,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);
}
}