【C#】接続済みデバイス名とポート番号を取得する

この記事は約1分で読めます。
Sponsored Link

会社に入って初めて組み込み系のソフト開発を行うにあたり、
デバッグ作業時、PCとのシリアル通信が必要になってくることが多い。

入社当初、Cとjava(さわり程度)しかわからない私にとって
「シリアル通信?なにそれ?」という状態から始まり
とりあえず、手っ取り早くWindows上で動くアプリを作る
必要に迫られ、何となく使ってみたC#。

今思えばC++の方がやっておけば、AndroidとかiOSアプリを
組む際に役に立ったのでは?・・・とちょっと後悔中。

まぁ、Javaを復習する前にオブジェクト指向系の言語に
触れる機会があっただけましとするか(´Д`;)。


C#には「SerialPortクラス」が実装されているため、
シリアル通信を行うソフト開発は非常に簡単。

但し、デバイス名を取得しないと接続するポート番号を
選択する際、「COM1、COM2、COM3・・・」とどの番号に
目的のデバイスが接続されているか迷うことが多い。

CapD20140510_1

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
// 追加
using System.IO.Ports;
using System.Management;
namespace Sample_SerialPortName
{
/*
* コンボボックス -> combox_SerialPort
* ボタン [接続] -> btnConnect
* ボタン [再認識]-> btnRefresh
* */
public partial class Form1 : Form
{
// List配列 - 初期宣言
List<string> PortList = new List<string>();
public Form1() {
InitializeComponent();
this.Text = "Sample_SerialPortName";
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e){
// ボタン
btn_Connect.Text = "接続";
btn_Refresh.Text = "再認識";
// 接続済みデバイス確認
SerialPort_Init();
}
/// <summary>
/// 接続済みデバイス確認
/// </summary>
private void SerialPort_Init()
{
int i = 0;
// コンボボックス - 初期化
combox_SerialPort.Items.Clear();
// 接続済みデバイス確認
ManagementClass device = new ManagementClass("Win32_PnPEntity");
// ポート名&COM番号取得
foreach (ManagementObject port in device.GetInstances()){
// ポート名を取得
string name = (string)port.GetPropertyValue("Name");
// "(COM" に一致する文字列数確認
i = name.IndexOf("(COM");
if (i >= 0){
// 取得したポート名とCOM番号をセット
combox_SerialPort.Items.Add(port.GetPropertyValue("Caption"));
// "COM*"を取り出して配列に追加
PortList.Add(name.Substring(i + 1).Replace(")", ""));
}
}
// 選択項目の一番上を表示する
if (combox_SerialPort.Items.Count > 0){
combox_SerialPort.SelectedIndex = 0;
}
}
/// <summary>
/// [再認識]ボタンを押す
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_Refresh_Click(object sender, EventArgs e) {
// List配列 全項目削除
PortList.RemoveRange(0, PortList.Count);
// デバイス再確認
SerialPort_Init();
}
/// <summary>
/// [接続]ボタン
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_Connect_Click(object sender, EventArgs e) {
// 接続状態 - 確認
if (serialPort.IsOpen == true) { // 接続中 -> 切断
serialPort.DiscardInBuffer(); // 受信バッファ破棄
try {
// 切断処理
serialPort.Close();
// ボタン変更
btn_Connect.Text = "接続";
// コンボボックス選択操作 - 有効
combox_SerialPort.Enabled = true;
// [再認識] ボタン有効
btn_Refresh.Enabled = true;
} catch (Exception ex) {
MessageBox.Show(ex.Message);
}
} else { // 未接続 -> 接続中
// コンボボックスで選択しているポート名を取得
serialPort.PortName = PortList[combox_SerialPort.SelectedIndex];
// ボーレートを設定
serialPort.BaudRate = 9600;
// データビットをセット
serialPort.DataBits = 8; // 8bit
// パリティビットをセット (パリティビット = なし)
serialPort.Parity = Parity.None;
// ストップビットをセット(ストップビット = 1bit)
serialPort.StopBits = StopBits.One;
// フロー制御 (ハンドシェイク = なし)
serialPort.Handshake = Handshake.None;
// 文字コードをセット (文字コード = デフォルト)
serialPort.Encoding = Encoding.Default;
try {
// 接続
serialPort.Open();
// ボタン変更
btn_Connect.Text = "切断";
// コンボボックス選択操作 - 無効
combox_SerialPort.Enabled = false;
// [再認識] ボタン無効化
btn_Refresh.Enabled = false;
MessageBox.Show(
"[ " + serialPort.PortName.ToString() + " ]"
+ "へ接続が完了しました。",
"確認",
MessageBoxButtons.OK,
MessageBoxIcon.Asterisk);
} catch (Exception ex) {
MessageBox.Show(ex.Message);
}
}
}
/// <summary>
/// フォームを閉じる。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_FormClosed(object sender, FormClosedEventArgs e) {
// 接続状態の場合、ポートを開放してから閉じる。
if (serialPort.IsOpen == true) { // 接続中 -> 切断
serialPort.DiscardInBuffer(); // 受信バッファ破棄
try {
serialPort.Close(); // 切断処理
} catch (Exception ex) {
MessageBox.Show(ex.Message);
}
}
}
}
}

備忘録なので解説はしません。
まぁ、コピペすれば基本動くので(´・ω・`)。

コメント

タイトルとURLをコピーしました