65.9K
CodeProject 正在变化。 阅读更多。
Home

一个实用的 WMI 工具和如何查找 USB 转串行适配器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.37/5 (18投票s)

2009年1月7日

CPOL

3分钟阅读

viewsIcon

214334

downloadIcon

7840

本文旨在介绍一个有用的WMI工具 (WMICodeCreator) 以及如何使用WMI查找USB串行/COM端口适配器。

WMICodeCreator.png

WMI-USB-SERIAL-FINDER.png

引言

本文有两个主要目的:

  • 介绍和推广一个有用的WMI工具 (WMICodeCreator)
  • 演示一些WMI代码,用于在系统中查找USB-Serial/COM端口适配器。

然而,本文不会涉及WMI的任何基础知识,也不会展示如何使用串行端口。这方面已经有很多有用的文章可供参考。本文也是我首次向The Code Project投稿,我最喜欢的学习创建酷炫新小工具的资源就是这里,所以我想回馈这个伟大的社区。

背景

我有一个项目,通过串行端口(老式的RS-232)控制投影仪的开关。控制投影仪的PC位于一个远离投影仪的服务器机房。它们之间通过一个KVM扩展器连接,该扩展器可以将VGA信号和USB信号通过单根CAT5以太网线传输长达120米。

所以,我必须使用USB转串口适配器与投影仪通信。这些适配器的问题在于它们是“虚拟端口”,会被分配一个随机的COM端口名称,例如COM7。而且它们有时会不稳定,改变端口名称,需要经常维护以定位投影仪。我不能依赖.NET的串行端口来获取名称,因为它也会返回非USB COM端口。由于每台PC只有一个适配器,因此使用WMI来搜索它是有意义的。

Using the Code

WMICodeCreator

我以前使用过Windows Management Instrumentation来查找MAC地址和磁盘驱动器。在WMI的宇宙中定位某个东西对我来说听起来很艰巨。在Google上输入所有关键词并没有给我带来多大帮助,直到有人在MSDN论坛上提到了WMICodeCreator。上面写着“*用这个工具玩转WMI*”。

它可用于搜索命名空间、类、属性、方法、限定符。您可以查询数据库、接收事件或仅浏览命名空间。它甚至在可能的情况下提供描述,“*MaximumBaudRate 属性指示最大...*”。找到您要找的东西后,选择您想要的编程语言(例如C#),它将生成您查询所需的代码。

USB转串口适配器

我过去曾使用过串口适配器。我一直遇到问题。当将它们插入不同的USB端口时,它们的名字会改变,例如从COM5变为COM6。

这是一个典型的Prolific适配器。

usb-serial-adapter.jpg

我附上了名为WMITestBed的VS2005 C#项目的源代码。之所以这么命名,是因为我想象未来我需要它来测试更多的WMI代码,而不仅仅是乏味的旧串行端口。它有一个USB串行查找器的有效演示,几乎就是从WMI实用程序中复制粘贴的代码。使用它来开始。在这里随意修改您自己的代码非常容易。

//Below is code pasted from WMICodeCreator
try
{
    ManagementObjectSearcher searcher =
        new ManagementObjectSearcher("root\\WMI",
        "SELECT * FROM MSSerial_PortName");

    foreach (ManagementObject queryObj in searcher.Get())
    {
        Console.WriteLine("-----------------------------------");
        Console.WriteLine("MSSerial_PortName instance");
        Console.WriteLine("-----------------------------------");
        Console.WriteLine("InstanceName: {0}", queryObj["InstanceName"]);

        Console.WriteLine("-----------------------------------");
        Console.WriteLine("MSSerial_PortName instance");
        Console.WriteLine("-----------------------------------");
        Console.WriteLine("PortName: {0}", queryObj["PortName"]);

        //If the serial port's instance name contains USB 
        //it must be a USB to serial device
        if (queryObj["InstanceName"].ToString().Contains("USB"))
        {
            Console.WriteLine(queryObj["PortName"] + " 
			is a USB to SERIAL adapter/converter");
        }
    }
}
catch (ManagementException e)
{
    MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
} 

关注点

为了输出代码的结果,我有一个名为DBug的类。正如其名,我用它来进行调试。我发现IDE中的Console在调试多个窗体时会变得过于混乱,所以我创建了这个。输出可以重定向到任何窗体,使其更灵活、更易于理解。我重写了ConsoleWriteLine,以便所有输出都转到窗体。如果您遇到任何含糊的编译错误,只需注释掉这个类,然后观察您的输出窗口。

别忘了

如果您创建了自己的项目,请不要忘记添加对System.Managment的引用,否则它将无法编译。

历史

  • 2009年1月7日:初次发布
© . All rights reserved.