zoukankan      html  css  js  c++  java
  • 获取Windows系统中的串口

    目的:获取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 + " " + 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个串口,效率太低。

  • 相关阅读:
    解决Android Studio Gradle DSL method not found: 'android()'
    【转】关于ListView中notifyDataSetChanged()刷新数据不更新原因
    设计模式-单例模式
    IE浏览器让DIV居中
    Java通过DOM解析XML
    git 配置文件位置;git配置文件设置
    git config配置
    dos2unix
    文件的编码问题解决
    git diff old mode 100644 new mode 100755
  • 原文地址:https://www.cnblogs.com/micemik/p/8259330.html
Copyright © 2011-2022 走看看