web-dev-qa-db-ja.com

シリアルポート情報の取得

シリアルポートをコンボボックスに読み込むコードがいくつかあります。

     List<String> tList = new List<String>(); 

     comboBoxComPort.Items.Clear();

     foreach (string s in SerialPort.GetPortNames())
     {
        tList.Add(s);
     }

     tList.Sort();
     comboBoxComPort.Items.Add("Select COM port...");
     comboBoxComPort.Items.AddRange(tList.ToArray());
     comboBoxComPort.SelectedIndex = 0;

リストにポートの説明(デバイスマネージャーのCOMポートに表示されるものと同様)を追加したい インデックス0の後のリスト内のアイテムを並べ替えます (解決済み:上記のスニペットを参照)。ポートの説明を追加するための提案はありますか? Microsoft Visual C#2008 Express Edition(.NET 2.0)を使用しています。あなたが持っているかもしれないどんな考えも高く評価されるでしょう。ありがとう。

31
Jim Fell

MSDNにこの同じ問題に関する投稿 があります:

C#でのシリアルポートに関する詳細情報の取得

こんにちはRavenb、

SerialPortタイプでは情報を取得できません。アプリケーションでこの情報が必要な理由はわかりません。ただし、あなたと同じ質問を持つ 解決済みスレッド があります。そこのコードをチェックアウトして、それが役立つかどうかを確認できます。

さらに問題がある場合は、お気軽にご連絡ください。

敬具、ブルース・周

その投稿のリンクは次のリンクに移動します。

System.IO.Ports.SerialPortを使用してポートに関する詳細情報を取得する方法

この情報はおそらくWMIクエリから取得できます。 このツール をチェックして、適切なコードを見つけてください。なぜあなたは気にしますか?これはUSBエミュレーターの詳細であり、通常のシリアルポートにはありません。シリアルポートは単に「COMx」によって認識され、それ以上のものはありません。

16

編集: 申し訳ありませんが、私はあなたの質問を素早く過ぎて圧縮しました。ポート名とポートの説明を含むリストを探していることがわかりました。それに応じてコードを更新しました...

System.Managementを使用すると、すべてのポート、および各ポートのすべての情報を照会できます(デバイスマネージャーと同じように...)

サンプルコード(System.Managementへの参照を必ず追加してください):

using System;
using System.Management;
using System.Collections.Generic;
using System.Linq;
using System.IO.Ports;        

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var searcher = new ManagementObjectSearcher
                ("SELECT * FROM WIN32_SerialPort"))
            {
                string[] portnames = SerialPort.GetPortNames();
                var ports = searcher.Get().Cast<ManagementBaseObject>().ToList();
                var tList = (from n in portnames
                            join p in ports on n equals p["DeviceID"].ToString()
                            select n + " - " + p["Caption"]).ToList();

                tList.ForEach(Console.WriteLine);
            }

            // pause program execution to review results...
            Console.WriteLine("Press enter to exit");
            Console.ReadLine();
        }
    }
}

詳細はこちら: http://msdn.Microsoft.com/en-us/library/aa394582%28VS.85%29.aspx

40
code4life

次のコードスニペットを使用する

実行すると、次の出力が得られます。

serial port : Communications Port (COM1)
serial port : Communications Port (COM2)

追加することを忘れないでください

using System;
using System.Management;
using System.Windows.Forms;

system.Managementへの参照も追加します(デフォルトでは使用できません)

C#

private void GetSerialPort()
{

    try
    {
        ManagementObjectSearcher searcher = 
            new ManagementObjectSearcher("root\\CIMV2", 
            "SELECT * FROM Win32_PnPEntity"); 

        foreach (ManagementObject queryObj in searcher.Get())
        {
            if (queryObj["Caption"].ToString().Contains("(COM"))
            {
                Console.WriteLine("serial port : {0}", queryObj["Caption"]);
            }

        }
    }
    catch (ManagementException e)
    {
        MessageBox.Show( e.Message);
    }

}

[〜#〜] vb [〜#〜]

  Private Sub GetAllSerialPortsName()
        Try
            Dim searcher As New ManagementObjectSearcher("root\CIMV2", "SELECT * FROM Win32_PnPEntity")
            For Each queryObj As ManagementObject In searcher.Get()
                If InStr(queryObj("Caption"), "(COM") > 0 Then
                    Console.WriteLine("serial port : {0}", queryObj("Caption"))
                End If
            Next
        Catch err As ManagementException
            MsgBox(err.Message)
        End Try
    End Sub

更新:確認することもできます

if (queryObj["Caption"].ToString().StartsWith("serial port"))

の代わりに

if (queryObj["Caption"].ToString().Contains("(COM"))
29
Sachin Chavan

ここで非常に多くの解決策を試してみましたが、うまくいかず、一部のポートしか表示されませんでした。しかし、以下はそれらのすべてとその情報を表示しました。

        using (var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE Caption like '%(COM%'"))
        {
            var portnames = SerialPort.GetPortNames();
            var ports = searcher.Get().Cast<ManagementBaseObject>().ToList().Select(p => p["Caption"].ToString());

            var portList = portnames.Select(n => n + " - " + ports.FirstOrDefault(s => s.Contains(n))).ToList();

            foreach(string s in portList)
            {
                Console.WriteLine(s);
            }
        }
    }
16
humudu

「インデックス0の後に項目を並べ替える」という意味がよくわかりませんが、SerialPort.GetPortNames()によって返される文字列の配列を並べ替えるだけの場合は、 Array.Sortを使用できます

2
Heinzi