概要
通常シリアルポート番号はPCにデバイスが接続された時点で自動で割り付けされます。
シリアル通信を行う場合"COM**"とポート番号を指定しますが、PCが変更になった
場合には変わってしまいます。
ポート番号一覧を表示して選択しても良いのですが、Bluetoothシリアル通信では
送信用、受信用で同一のデバイス名で表示されるため違いが分かりません。
色々調べた結果、USBデバイスのユニークIDが取得できるとのことで、このIDとCOMポート
番号を紐づけすることができました。
デバイスのユニークIDについて
デバイスマネージャーを起動し、'詳細タブ'から'デバイス インスタンス パス'を選択すると
表示されます。このIDをあらかじめ調べておく必要があります。
作成したプログラムについて
プログラムを起動するとForm1が表示されます。
テキストボックスにデバイスマネージャーで調べておいたデバイスインスタンスパスを入力後、
COM番号取得ボタンを押すと隣のテキストボックスに表示されます。
また、別のPCに接続してもCOM番号を取得できました。
環境
VisualStudio C# .NET6.0
※NuGetで「System.Management」をインストール。
コード
using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel;
using System.Management;
namespace _comPort_get
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
// インスタンス作成
ManagementClass device = new ManagementClass("Win32_PnPEntity");
// 接続されたデバイスを取得
foreach (ManagementObject port in device.GetInstances())
{
// デバイスインスタンスパス取得
string dev_uqid = (string)port.GetPropertyValue("PNPDeviceID");
// デバイス名取得
string name = (string)port.GetPropertyValue("Name");
// デバイスインスタンスパスに一致するか確認
if (dev_uqid.Contains(textBox1.Text))
{
// "(COM" に一致するインデックス取得
int index = name.IndexOf("(COM");
// com番号取得
string comPort = name.Substring(index + 1).Replace(")", "");
// 表示
textBox2.Text = comPort;
}
}
}
}
}
参考サイト