自动识别查找特定的串口号 比如设备管理器中Modem属性里的串口 按这个方法可以获取设备管理器任意信息。C++
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++相关推荐
- excel查找出不来了_在excel中明明表格里有搜索的内容,但搜索不出来。显示的是“找不到正在搜索的数据”...
1.如图:我们可以清楚看到,我做的这个简单表格中包含"25"这样一个数值.2.下面我们用"查找"的方法,查找一下"25",ctrl+F打开& ...
- java中批次号_在一个批次中插入多笔记录的几种方法
插入数据库方法很多,下面Insus.NET列举几种方法,看看你常用的是哪一种: 创建一张表: CREATE TABLE [dbo].[Network_Info] ( [ID] INT NOT NULL ...
- C++从文件中查找特定的字符串,并提取该字符串
记录一个小技巧,使用C++从文件中查找特定标记的字符串,并提取该字符串. 用到了CString的方法,十分的简单,用于数据分析很方便. 这是我截取的压缩编码试验程序中的代码,通过这段代码可以提取X26 ...
- 没有计算机网络适配器,如果win10设备管理器中没有网络适配器,该怎么办?
在操作计算机时,通常会在Win10系统设备管理器中遇到没有网络适配器的故障. 那么如何处理Win10系统的设备管理器中没有网络适配器的故障?如果对Win10系统的设备管理器中没有网络适配器,许多对计算 ...
- 查找对象数组中某属性的最大最小值
查找对象数组中某属性的最大最小值的快捷方法 例如要查找array数组中对象的value属性的最大值,这里记为maxVal var array=[{"index_id": 119,& ...
- mysql 根据行号查询_MySql:查找特定记录的行号
我正在使用一个通用数据面板,该面板可以具有各种不同的查询来填充该面板.它们可能是从表或视图中选择的简单查询,也可能是用户使用复杂的联接和其他表达式定义自己的复杂查询.我试图修改数据面板,以便如果用户选 ...
- 通过串口号获得该串口号对应的设备信息(如设备范例ID等)
前几天一直在处理标题上面的那个问题,搜遍千山万水,反复实验,最后终于找到一种方法,本文不仅仅介绍这种方法,还介绍了解决问题的整个过程,还有一些通用的东西,希望能向那些和我一样一点不懂C/C++,不懂w ...
- QT入门第十四天 串口通信协议+收发数据+波特率+数据位+停止位+奇偶校验+串口识别射频RFID的卡号
QT入门第十四天 串口通信[QT入门第十四天 串口通信协议+收发数据+波特率+数据位+停止位+奇偶校验+串口识别射频RFID的卡号 第一章 常见的硬件通信接口协议 [1]硬件通信接口协议 [2]使用串 ...
- android usb设备节点_(五)树莓派3开发环境搭建——6.树莓派USB与tty串口号绑定...
通过前面一系列的铺垫,相信大家对整个miiboo机器人的DIY有了一个清晰整体的认识.接下来就正式进入机器人大脑(嵌入式主板:树莓派3)的开发.本章将从树莓派3的开发环境搭建入手,为后续ros开发.s ...
最新文章
- java 数组的基本操作
- 企业级闪存弥补数据经济价值短板
- Leetcode题目:Balanced Binary Tree
- 【Python】Python 远程连接服务器,用它就够了
- Maven之依赖管理
- 2021中考高考成绩查询,2021中考
- Android Application基本组成部分
- php之预处理(msqli和PDO)
- mac win7 计算机,详解mac如何安装win7
- 利用360卫士打补丁
- 正则摄动法matlab,孤立特征值情况的矩阵摄动法
- 10098 全排列水题
- 计算机考证报名时间表
- iPhone开发播放音乐与按钮声音
- 防御攻击高防服务器如何选择?
- 汇编语言-CPU如何区分指令和数据
- signature=45f0fd12ff31dea1feafec2c512144de,急性荨麻疹伴心电图异常与变应原检测123例相关性研究...
- Java汉字获取拼音、笔划、偏旁部首
- Hugo 博客搭建教程
- 出现“找不到该项目”的错误提示解决方法
热门文章
- 计算机软考中级能评职称吗,软考中级是中级职称么?考此证后可以办理落户么?...
- 北京注册的公司如何缴纳公积金
- NSIS对卸载程序的签名
- w8电脑桌面计算机不见了,w8桌面上我的电脑图标不见了怎么办
- 篇1:如何为FPGA选择合适的电源管理方案
- java入门编程之个人通讯录管理系统
- 全国大学生“高教杯”成图大赛——如何绘制锥度斜度
- Promise及其应用
- 下载 raywenderlich.com 上的 iOS/android/Unity 视频、源码
- 模拟CS (警察和匪徒)