1.目标: 自动识别查找特定的串口号

2.注册表里搜串口号

设备管理器中所有的信息都在注册表中有,那么我直接在注册表里搜COM143。

搜到了这个,但这里有2个名称key相同的。后面193,192还是可能会变的,不方便精确识别。继续搜。

这里可以。

最后一个了。

共有5个地方存在:

计算机\HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM
计算机\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4d36e96d-e325-11ce-bfc1-08002be10318}\0010
计算机\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\USB\VID_05C6&PID_9091&MI_01\6&c6a59d9&0&0001\Device Parameters
计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4d36e96d-e325-11ce-bfc1-08002be10318}\0010
计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\VID_05C6&PID_9091&MI_01\6&c6a59d9&0&0001\Device Parameters

计算机\HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM列出了所有串口

3.具体筛选

1)看看ControlSet001、ControlSet002、CurrentControlSet的区别

1、ControlSet001:系统真实的配置信息
2、ControlSet002:最后一次成功启动的配置信息
3、CurrentControlSet:系统运行时的配置信息

一、系统启动时,从ControlSet001复制到CurrentControlSet中。
二、系统运行时,修改的都是CurrentControlSet中的信息。
三、系统重启时,从CurrentControlSet复制到ControlSet001中。
四、系统正常启动时,从ControlSet001和CurrentControlSet复制到ControlSet002。
五、开机选择“最近一次正确配置”时,从ControlSet002复制到CurrentControlSet中。

所有选CurrentControlSet分支。

2)Control与Enum分支的区别

Windows驱动有三种注册表键负责配置。它们是硬件(或实例), 类和 服务。

  • 硬件(或实例)键包含单个设备的信息。
  • 类键涉及所有相同类型设备的共同信息。
  • 服务键包含驱动程序信息。
注册表 路径
硬件(hardware)键 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Enum\总线\硬件ID]
类(class)键 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Control\Class\GUID]
服务(service)键 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\服务名]

因为GUID我可以获取,我这里选Control,即

计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4d36e96d-e325-11ce-bfc1-08002be10318}\0010

4.代码实现

C# python自动获取modem里的串口号 高通芯片C++ MFC_小黄人软件的博客-CSDN博客

C++ C#自动获得特定串口 获得串口列表_小黄人软件的博客-CSDN博客_c#获取串口列表

C++实现:

先拼成注册表路径,再读注册表。

// PrintDeviceInfo.cpp : 定义控制台应用程序的入口点。
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <Windows.h>
#include <setupapi.h>
#pragma comment(lib, "setupapi.lib")// 注册表  找特定的串口号
//计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4d36e96d-e325-11ce-bfc1-08002be10318}\0010
//AttachedTo=?
//return 特定的串口号 或 -1没找到特定串口  -2打开串口注册表 失败
int getF200SpecialComNumByRegister(char *guid)
{HKEY hkey;int result;int i = 0;//char path[100] = "SYSTEM\\CurrentControlSet\\Control\\Class\\{4d36e96d-e325-11ce-bfc1-08002be10318}\\0010";char path[100] = "SYSTEM\\CurrentControlSet\\Control\\Class\\";strcat_s(path, guid);result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, path, NULL, KEY_READ, &hkey);if (ERROR_SUCCESS == result)   //打开串口注册表   {do{TCHAR portName[0x100] = { 0 };//portName是注册表名称(不是设备管理器里的前缀),commName就是值 串口名字COMNTCHAR commName[0x100] = { 0 };DWORD dwSize = sizeof(portName) / sizeof(TCHAR);DWORD dwLong = dwSize;result = RegEnumValue(hkey, i, portName, &dwLong, NULL, NULL, (LPBYTE)commName, &dwSize);if (ERROR_NO_MORE_ITEMS == result) { break; }             //   枚举串口                   printf("%d %s %s\n", i, portName, commName); //显示名称及值if ((strcmp(portName, "AttachedTo") == 0)) //特定串口{RegCloseKey(hkey); //关闭注册表return atoi(commName + 3);//去掉COM只取号 正常返回}i++;} while (TRUE);RegCloseKey(hkey); //关闭注册表return -1;//没找到特定串口}return -2;//打开串口注册表 失败
}//获取特定串口号 示例Qualcomm HS-USB Diagnostics 9091 (COM20)
int getSpecialComNum(const char *in)
{char out[100] = { 0 };sscanf_s(in, "Qualcomm HS-USB Diagnostics 9091 (COM%[0-9])", out,sizeof(out)); //不是%d哦return atoi(out);
}
//从设备信息中 获取特定串口号  @return <=0无效
int  getSpecialComNumFromDevInfo()
{printf("Locale is: %s\n", setlocale(LC_ALL, "chs"));//设置为中文HDEVINFO hDevInfo = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_PRESENT|DIGCF_ALLCLASSES);if (hDevInfo == INVALID_HANDLE_VALUE){printf("SetupDiGetClassDevs Err:%d", GetLastError());return -2;};SP_DEVINFO_DATA spDevInfoData = { 0 };spDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);for (DWORD i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &spDevInfoData); i++)  {//char  szBuf[MAX_PATH] = { 0 };//if (!SetupDiGetDeviceRegistryPropertyA(hDevInfo, &spDevInfoData, SPDRP_CLASS, NULL, (PBYTE)szBuf, MAX_PATH, 0)) {   continue;       };//if (strcmp(szBuf, "Ports") != 0  && strcmp(szBuf, "Modem") != 0) //只取端口//{        continue;       }char  szName[MAX_PATH] = { 0 };if (SetupDiGetDeviceRegistryPropertyA(hDevInfo, &spDevInfoData, SPDRP_FRIENDLYNAME, NULL, (PBYTE)szName, MAX_PATH - 1, 0)){if (strcmp(szName, "Qualcomm HS-USB Modem 9091 #3") != 0) { continue; } //只取这个printf("FriendlyName:%s\r\n", szName);   }else { continue; }memset(szName,0,sizeof(szName));if (SetupDiGetDeviceRegistryPropertyA(hDevInfo, &spDevInfoData, SPDRP_DRIVER, NULL, (PBYTE)szName, MAX_PATH - 1, 0)){printf("%d Device:%s\r\n", i, szName);return getF200SpecialComNumByRegister(szName);break;}}SetupDiDestroyDeviceInfoList(hDevInfo);printf("Can not find Modem COM");return -4;
}int  main(int  argc, char* argv[])
{printf("自动识别串口号:%d\n",getSpecialComNumFromDevInfo());getchar();return  0;
}

按这个方法可以获取设备管理器任意信息。

自动识别查找特定的串口号 比如设备管理器中Modem属性里的串口 按这个方法可以获取设备管理器任意信息。C++相关推荐

  1. excel查找出不来了_在excel中明明表格里有搜索的内容,但搜索不出来。显示的是“找不到正在搜索的数据”...

    1.如图:我们可以清楚看到,我做的这个简单表格中包含"25"这样一个数值.2.下面我们用"查找"的方法,查找一下"25",ctrl+F打开& ...

  2. java中批次号_在一个批次中插入多笔记录的几种方法

    插入数据库方法很多,下面Insus.NET列举几种方法,看看你常用的是哪一种: 创建一张表: CREATE TABLE [dbo].[Network_Info] ( [ID] INT NOT NULL ...

  3. C++从文件中查找特定的字符串,并提取该字符串

    记录一个小技巧,使用C++从文件中查找特定标记的字符串,并提取该字符串. 用到了CString的方法,十分的简单,用于数据分析很方便. 这是我截取的压缩编码试验程序中的代码,通过这段代码可以提取X26 ...

  4. 没有计算机网络适配器,如果win10设备管理器中没有网络适配器,该怎么办?

    在操作计算机时,通常会在Win10系统设备管理器中遇到没有网络适配器的故障. 那么如何处理Win10系统的设备管理器中没有网络适配器的故障?如果对Win10系统的设备管理器中没有网络适配器,许多对计算 ...

  5. 查找对象数组中某属性的最大最小值

    查找对象数组中某属性的最大最小值的快捷方法 例如要查找array数组中对象的value属性的最大值,这里记为maxVal var array=[{"index_id": 119,& ...

  6. mysql 根据行号查询_MySql:查找特定记录的行号

    我正在使用一个通用数据面板,该面板可以具有各种不同的查询来填充该面板.它们可能是从表或视图中选择的简单查询,也可能是用户使用复杂的联接和其他表达式定义自己的复杂查询.我试图修改数据面板,以便如果用户选 ...

  7. 通过串口号获得该串口号对应的设备信息(如设备范例ID等)

    前几天一直在处理标题上面的那个问题,搜遍千山万水,反复实验,最后终于找到一种方法,本文不仅仅介绍这种方法,还介绍了解决问题的整个过程,还有一些通用的东西,希望能向那些和我一样一点不懂C/C++,不懂w ...

  8. QT入门第十四天 串口通信协议+收发数据+波特率+数据位+停止位+奇偶校验+串口识别射频RFID的卡号

    QT入门第十四天 串口通信[QT入门第十四天 串口通信协议+收发数据+波特率+数据位+停止位+奇偶校验+串口识别射频RFID的卡号 第一章 常见的硬件通信接口协议 [1]硬件通信接口协议 [2]使用串 ...

  9. android usb设备节点_(五)树莓派3开发环境搭建——6.树莓派USB与tty串口号绑定...

    通过前面一系列的铺垫,相信大家对整个miiboo机器人的DIY有了一个清晰整体的认识.接下来就正式进入机器人大脑(嵌入式主板:树莓派3)的开发.本章将从树莓派3的开发环境搭建入手,为后续ros开发.s ...

最新文章

  1. java 数组的基本操作
  2. 企业级闪存弥补数据经济价值短板
  3. Leetcode题目:Balanced Binary Tree
  4. 【Python】Python 远程连接服务器,用它就够了
  5. Maven之依赖管理
  6. 2021中考高考成绩查询,2021中考
  7. Android Application基本组成部分
  8. php之预处理(msqli和PDO)
  9. mac win7 计算机,详解mac如何安装win7
  10. 利用360卫士打补丁
  11. 正则摄动法matlab,孤立特征值情况的矩阵摄动法
  12. 10098 全排列水题
  13. 计算机考证报名时间表
  14. iPhone开发播放音乐与按钮声音
  15. 防御攻击高防服务器如何选择?
  16. 汇编语言-CPU如何区分指令和数据
  17. signature=45f0fd12ff31dea1feafec2c512144de,急性荨麻疹伴心电图异常与变应原检测123例相关性研究...
  18. Java汉字获取拼音、笔划、偏旁部首
  19. Hugo 博客搭建教程
  20. 出现“找不到该项目”的错误提示解决方法

热门文章

  1. 计算机软考中级能评职称吗,软考中级是中级职称么?考此证后可以办理落户么?...
  2. 北京注册的公司如何缴纳公积金
  3. NSIS对卸载程序的签名
  4. w8电脑桌面计算机不见了,w8桌面上我的电脑图标不见了怎么办
  5. 篇1:如何为FPGA选择合适的电源管理方案
  6. java入门编程之个人通讯录管理系统
  7. 全国大学生“高教杯”成图大赛——如何绘制锥度斜度
  8. Promise及其应用
  9. 下载 raywenderlich.com 上的 iOS/android/Unity 视频、源码
  10. 模拟CS (警察和匪徒)