28

私のプロジェクトでは、USB に接続されているときに特定のデバイスを検出する必要があります。このデバイスを特定できる唯一の方法は、com ポートではなく、その説明/デバイス名です。正しい機能を実行するために私が見つけたのは、WMI クエリを使用して name プロパティをチェックすることです。

ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * from WIN32_SerialPort");
            foreach (ManagementObject port in searcher.Get())
            {
                deviceName = (string)foundPort.GetPropertyValue("Name"); 
                ...

最初に電話を接続してこれをテストしたところ、クエリは期待どおりに COM3 で見つかった電話を返しました。次に、別のデバイス (このプロジェクトに必要なデバイスによく似た USB からシリアルへのコンバーター) を接続しましたが、クエリは単にそれを見つけられませんでした。電話だけが見つかります。ただし、このデバイスは、デバイス マネージャーのポート COM4 に表示されます。さらに困ったことに、SerialPort クラスは両方のデバイスを検出しますが、デバイスを識別するために必要な情報を提供しません。

    string[] tempPorts = SerialPort.GetPortNames();

私は SO や他の場所で多数のスレッドを読みましたが、満足のいく解決策を見つけることができません。WIN32_SerialPort クエリで他のデバイスが見つからない理由を誰かが明確にしてくれませんか? 何らかの理由で win32 シリアル ポートと見なされないのですか? そして、誰かがこの問題の解決策を教えてくれませんか?

4

4 に答える 4

26

すべてのシリアル ポートを一覧表示する方法:

ハードウェア ベンダーが利用できるシステム定義のデバイス セットアップ クラスがいくつかあります。適切に作成されたドライバーは、 -class (guid: )COM-Portsを使用する必要があります。おそらく、このクラスはデバイス マネージャーでも使用されます。Ports (COM & LPT ports)4d36e978-e325-11ce-bfc1-08002be10318

したがって、次のクエリを使用して、デバイス マネージャーにも表示されるすべてのシリアル ポートを一覧表示できます。

ManagementObjectSearcher searcher = new ManagementObjectSearcher(
    "root\\CIMV2",
    "SELECT * FROM Win32_PnPEntity WHERE ClassGuid=\"{4d36e978-e325-11ce-bfc1-08002be10318}\""
);
foreach (ManagementObject queryObj in searcher.Get())
{
    // do what you like with the Win32_PnpEntity
}

このWin32_PnPEntityクラスの詳細な説明を参照してください。デバイスを識別するために必要なものがすべて揃っている必要があります。

ポート番号を決定するために、name プロパティを調べて抽出します。これまでは問題なく動作していましたが、名前にポート番号を含めることが保証されているかどうかはわかりません。名前にポート番号が含まれていないシリアルポートデバイスは今まで見つかりませんでした。

上記のクエリは、Bluetooth SPP、FTDI チップ、メインボード上のポート、拡張カード、モデム ドライバ (つまり Globetrotter GTM66xxW) によって生成された仮想シリアル ポートのいずれであっても、すべてのシリアル ポート デバイスを検出します。

接続のタイプ (Bluetooth、USB など) を判別するには、deviceid を調べることができます (deviceid の最初の部分を見てください)。そこで bt-mac アドレスを抽出することもできます (注意してください: 少なくとも Windows 7 と Windows XP では deviceid が異なって見えます)。

一部のデバイスが Win32_SerialPort でリストされていない理由について:

ポートがリストされているUSBデバイスとリストされていないUSBデバイスがあるため、ドライバーの実装に依存していると思われます。

于 2014-05-14T10:24:41.537 に答える
6

私はあなたがやろうとしていることを理解していると思います。この記事httpからWMICodeCreator(WMICodeCreator http://www.microsoft.com/en-us/download/details.aspx?id=8572へのリンク)を使用して作成されたこのコードを見てください。 ://www.codeproject.com/Articles/32330/A-Useful-WMI-Tool-How-To-Find-USB-to-Serial-Adapto

//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);
} 
于 2012-07-12T23:44:33.307 に答える