シリアルポートをコンボボックスに読み込むコードがいくつかあります。
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)を使用しています。あなたが持っているかもしれないどんな考えも高く評価されるでしょう。ありがとう。
MSDNにこの同じ問題に関する投稿 があります:
C#でのシリアルポートに関する詳細情報の取得
こんにちはRavenb、
SerialPortタイプでは情報を取得できません。アプリケーションでこの情報が必要な理由はわかりません。ただし、あなたと同じ質問を持つ 解決済みスレッド があります。そこのコードをチェックアウトして、それが役立つかどうかを確認できます。
さらに問題がある場合は、お気軽にご連絡ください。
敬具、ブルース・周
その投稿のリンクは次のリンクに移動します。
System.IO.Ports.SerialPortを使用してポートに関する詳細情報を取得する方法
この情報はおそらくWMIクエリから取得できます。 このツール をチェックして、適切なコードを見つけてください。なぜあなたは気にしますか?これはUSBエミュレーターの詳細であり、通常のシリアルポートにはありません。シリアルポートは単に「COMx」によって認識され、それ以上のものはありません。
編集: 申し訳ありませんが、私はあなたの質問を素早く過ぎて圧縮しました。ポート名とポートの説明を含むリストを探していることがわかりました。それに応じてコードを更新しました...
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
次のコードスニペットを使用する
実行すると、次の出力が得られます。
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"))
ここで非常に多くの解決策を試してみましたが、うまくいかず、一部のポートしか表示されませんでした。しかし、以下はそれらのすべてとその情報を表示しました。
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);
}
}
}
「インデックス0の後に項目を並べ替える」という意味がよくわかりませんが、SerialPort.GetPortNames()
によって返される文字列の配列を並べ替えるだけの場合は、 Array.Sortを使用できます 。