ミリ秒測定のAVR側は一段落ついた ので、Windows側のプログラムに着手。Windows側からはシリアルポートと認識されるので、そのポートと通信するプログラムにすればOK。実際これまでの動作確認はTeraterm を使ってました。.NET Framework 2.0以降はシリアルポートをサポート してますので、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()[参考]
Comments