シリアルポートの名前取得

blog20100704-GetSerialPortEntries

ミリ秒測定のAVR側は一段落ついたLink ので、Windows側のプログラムに着手。Windows側からはシリアルポートと認識されるので、そのポートと通信するプログラムにすればOK。実際これまでの動作確認はTeratermLink を使ってました。.NET Framework 2.0以降はシリアルポートをサポートLink してますので、Visual C# 2010 Expressなら通信もさほど苦労しないでしょう。

まずは利用可能なシリアルポートの取得。最初に見つけたのはSystem.IO.Ports.SerialPort.GetPortNames()。これは'COM1', 'COM2'といったポートの番号を返してくれます。しかしTeratermでは'通信ポート (COM1)', 'AT90USBxxx CDC USB to UART MGM (COM3)'のようにより詳細な名前が表示され分かりやすいので、できればこういう表示をしたいところ。

こういう時はWMIを使えばよいそうで、以下サンプルコード。
using System.Collections.Generic;
using System.Management;
(略)
Dictionary PortsTable = new Dictionary<string, string>();
ManagementClass mcW32SerPort = new ManagementClass("Win32_SerialPort");
foreach (ManagementObject aSerialPort in mcW32SerPort.GetInstances())
{
  PortsTable.Add(
    (string)aSerialPort.GetPropertyValue("Caption"),
    (string)aSerialPort.GetPropertyValue("DeviceID"));
}

comboBoxCOMPorts.Items.Clear();
foreach (string aPortCaption in PortsTable.Keys)
{
  comboBoxCOMPorts.Items.Add(aPortCaption);
}
GetPropertyValue("Caption")が画面表示用の詳細な名前を返してくれます。わざわざDictionaryオブジェクトで格納してるのは、この後ポートを開くときにはDeviceIDで指定しないといけないからです。

画面はシリアルポートのリストが取得できているという画面。下のテキストはAVR側からの応答で、受信もちゃんとできていることを確認。

ちなみに'Caption'や'DeviceID'といった文字列は、PowerShellで以下のコマンドを入力すると参考になります。
> Get-WmiObject -Class Win32_SerialPort
または
> $wmiser = new-object System.Management.ManagementClass "Win32_SerialPort"
> $wmiser.GetInstances()
[参考]

— posted by mu at 05:52 pm   commentComment [0]  pingTrackBack [0]

T: Y: ALL: Online:
ThemeSwitch
  • Basic
Created in 0.0103 sec.
prev
2010.7
next
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31