目的:获取Windows系统中的所有可用和在用串口

方法:注册表查询法

优点:简单、实用、快速、无遗漏,无多余结果。

说明:另外还有8种方法可以枚举串口,但都不如此法。

代码和详细注释如下:

//---------------------------------------------------------------------------
// 枚举串口
void __fastcall TForm1::BtnEnumClick(TObject *Sender)
{
// 清除信息提示区
Memo1->Clear(); // 清空串口列表, sg 是 TStringGrid 对象
sg->Clear();
sg->Cells[0][0] = L"串口物理名称";
sg->Cells[1][0] = L"串口逻辑名称"; // 就是 COM1, COM2 之类的 // 列标题居中对齐
sg->Alignments[0][0] = taCenter;
sg->Alignments[1][0] = taCenter; // 创建注册表对象
std::auto_ptr<TRegistry> Registry(new TRegistry(KEY_READ));

try
{
// 注册表根路径
Registry->RootKey = HKEY_LOCAL_MACHINE; // 打开串口设备所在的注册表路径
bool bResult = Registry->OpenKey("\\HARDWARE\\DEVICEMAP\\SERIALCOMM", false); // 若打开注册表失败,提示信息,直接返回
if (!bResult) {
ShowHint("注册表路径不存在.");
return;
} // 数据项(名称)列表,就是串口物理名称列表
std::auto_ptr<TStringList> ItemNameList(new TStringList()); // 获取数据项(名称)列表,就是串口物理名称列表
Registry->GetValueNames(ItemNameList.get()); // 单个数据项的名称和值 (字符串形式),值的字符串形式就是串口逻辑名称,就是COM1, COM2 之类的
UnicodeString sItemName, sItemValue; // 逐个获取数据项值 (字符串形式)
for (int i = 0; i < ItemNameList->Count; i++)
{
// 当前数据项名称,也就是串口物理名称
sItemName = ItemNameList->Strings[i]; // 读取对应的数据项值 (字符串形式),也就是串口逻辑名称
sItemValue = Registry->ReadString(sItemName); // 显示串口物理名称和串口逻辑名称
//ShowHint(sItemName + "\t" + sItemValue);
// sg 是 TStringGrid 对象
sg->Cells[0][i + 1] = sItemName;
sg->Cells[1][i + 1] = sItemValue;
sg->AutoSizeColumns(true, 0);
} // 关闭会产生写入操作
//Registry->CloseKey();
}
// 在读取注册表时发生异常
catch(...) {
ShowHint("在读取注册表时发生异常.");
}
}
//---------------------------------------------------------------------------

以下是程序运行结果:

说明1:若只想获得可用(空闲)串口,还得逐个打开上述串口,成功打开的是可用(空闲)串口,否则为在用(被其它程序占用的)串口。

说明2:若要支持热插拔串口,还需响应 WM_DEVICECHANGE 消息。

枚举串口的各种方法对比

枚举串口方法

说明

EnumPorts

能够获得历史上曾经在系统中存在过的所有串口,不实用

WMI

无法获取纯粹用软件虚拟出来的串口,例如VSPD串口

注册表

简便、实用、快速,无遗漏,无多余

SetupAPI

GUID_DEVINTERFACE_COMPORT

结果同注册表法,但结果信息太详细,能够分辨出串口类型是纯软件虚拟的,还是蓝牙虚拟的,还是USB虚拟的,等等。

SetupAPI

Ports Device   information set

结果同注册表法,但结果信息太详细,能够分辨出串口类型是纯软件虚拟的,还是蓝牙虚拟的,还是USB虚拟的,等等。

GetDefaultCommConfig

结果有遗漏

QueryDosDevice

结果同注册表法,

文件读写法

结果同注册表法,但要尝遍255个串口,效率太低。

获取Windows系统中的所有可用和在用串口的更多相关文章

  1. Pyqt 获取windows系统中已安装软件列表

    开始之前的基础知识 1. 获取软件列表 在Python的标准库中,_winreg可以操作Windows的注册表.获取已经安装的软件列表一般是读去windows的注册表: SOFTWARE\Micros ...

  2. 这段百度问答,对我相关有对啊!!!----如何获取Windows系统登陆用户名

    如何获取Windows系统登陆用户名 http://zhidao.baidu.com/link?url=Hva9PkVwYZv8KSEWftSqTWe8fqM1dhoq59BurnfADmcOvFjF ...

  3. Windows系统中CreateFileMapping实现的共享内存及用法

    在32位的Windows系统中,每一个进程都有权访问他自己的4GB(232=4294967296)平面地址空间,没有段,没有选择符,没有near和far指针,没有near和far函数调用,也没有内存模 ...

  4. UEFI+GPT模式下的Windows系统中分区结构和默认分区大小及硬盘整数分区研究

    内容摘要:本文主要讨论和分析在UEFI+GPT模式下的Windows系统(主要是最新的Win10X64)中默认的分区结构和默认的分区大小,硬盘整数分区.4K对齐.起始扇区.恢复分区.ESP分区.MSR ...

  5. 通过PowerShell获取Windows系统密码Hash

    当你拿到了系统控制权之后如何才能更长的时间内控制已经拿到这台机器呢?作为白帽子,已经在对手防线上撕开一个口子,如果你需要进一步扩大战果,你首先需要做的就是潜伏下来,收集更多的信息便于你判断,便于有更大 ...

  6. 快速获取Windows系统上的国家和地区信息

    Windows系统上包含了200多个国家和地区的数据,有时候编程需要这些资料.以下代码可以帮助你快速获取这些信息.将Console语句注释掉,可以更快的完成分析. static void Main(s ...

  7. Python使用WMI模块获取Windows系统的硬件信息,并使用pyinstaller库编译打包成exe的可执行文件

    由于公司现阶段大多数应用软件都是基于Windows系统开发和部署,很多软件安装部署都是在windows server 2012.windows server 2008之类的服务器上,部门同事每次测试一 ...

  8. [源码]一键获取windows系统登陆密码vc6版源码

    [源码]一键获取windows系统登陆密码vc6版源码支持:XP/2000/2003/WIN7/2008等 此版本编译出来的程序体积较小几十KB... 而vs版则1点几M,体积整整大了2-30倍对某些 ...

  9. C/C++获取Windows系统CPU和内存及硬盘使用情况

    //1.获取Windows系统内存使用率 //windows 内存 使用率 DWORD getWin_MemUsage(){ MEMORYSTATUS ms; ::GlobalMemoryStatus ...

随机推荐

  1. POI tools 参数化生成excel表格

    package com.eccom.neteagle.server.confsave.service.impl; import java.io.File; import java.io.FileNot ...

  2. Object-C中release的机制问题

    今天写了例如以下的一段代码: for (NSInteger i = 0; i < 10000000; i++) { UIView * v = [[UIView alloc] init]; [v ...

  3. Hibernate学习笔记(五) — 多对多关系映射

    多对多关系映射 多对多建立关系相当于在第三张表中插入一行数据 多对多解除关系相当于在第三张表中删除一行数据 多对多改动关系相当于在第三张表中先删除后添加 多对多谁维护效率都一样.看需求 在实际开发过程 ...

  4. 第一次面试&amp;第一次霸面

    哈哈哈哈,第一次面试和第一次都献给了CVTE! CVTE的招聘流程有点特别:网測-- 一面--笔试--二面--offer 想起网測那天就心酸.那先在做第三部分的专业測试.计时器突然出错........ ...

  5. uva--10700

    题意: 输入一串仅仅含有+和*号的表达式,能够通过加入括号来改变表达式的值,求表达式的最大最小值. 思路: 表达式中的数都是不大于20的正整数,由a*b+c<=a*(b+c)能够知道.先算乘法后 ...

  6. Javascript自动化文档工具JSDuck在Windows下的使用心得

    作者: zyl910 一.工具比较 为了让前端JavaScript程序更具可维护性,更利于团队开发,文档非常重要.此时便需要使用自动化文档工具了. 我对比了各种JavaScript自动化文档工具,发现 ...

  7. python+appium+unittest自动化测试框架环境搭建

    一.基础软件准备 1.python 版本最新版本,python的IDE使用pycharm.具体的下载链接: python https://www.python.org/ pycharm:https:/ ...

  8. mysql 常用sql语句 一

    创建数据库 create database if not exists wsp_test default charset utf8 collate utf8_general_ci 使用数据库 use ...

  9. url_for()中的坑,url_for操作对象是函数,而不是route里的路径

    url_for操作对象是函数,而不是route里的路径. url_for操作对象是函数,而不是route里的路径. url_for操作对象是函数,而不是route里的路径.

  10. JAVA 解析、编辑nginx.conf

    最近工程开发遇到一个需求:用Java去解析并编辑nginx.conf 在github上找到nginx-java-parser工具,项目地址:https://github.com/odiszapc/ng ...