会社に入って初めて組み込み系のソフト開発を行うにあたり、
デバッグ作業時、PCとのシリアル通信が必要になってくることが多い。
入社当初、Cとjava(さわり程度)しかわからない私にとって
「シリアル通信?なにそれ?」という状態から始まり
とりあえず、手っ取り早くWindows上で動くアプリを作る
必要に迫られ、何となく使ってみたC#。
今思えばC++の方がやっておけば、AndroidとかiOSアプリを
組む際に役に立ったのでは?・・・とちょっと後悔中。
まぁ、Javaを復習する前にオブジェクト指向系の言語に
触れる機会があっただけましとするか(´Д`;)。
C#には「SerialPortクラス」が実装されているため、
シリアル通信を行うソフト開発は非常に簡単。
但し、デバイス名を取得しないと接続するポート番号を
選択する際、「COM1、COM2、COM3・・・」とどの番号に
目的のデバイスが接続されているか迷うことが多い。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} | |
} | |
} | |
} |
備忘録なので解説はしません。
まぁ、コピペすれば基本動くので(´・ω・`)。
コメント