Infinite Kayrlas

メカをまとって空を飛ぶ

WPFでSerial Monitorライクなアプリを作ってみた

2018年某日,研究でC#を用いて機械制御する場面に直面し,当時まともなC#アプリケーションを作ったことがなかった私が最初に手を付けた企画です.リアルタイムに通信して制御することが予想できたため,比較的扱いやすいArduinoとのシリアル通信を採用しました.アプリの紹介エントリです.

 

実装

C#でシリアル通信を行う手法の大半は以下の記事を参考にさせていただきました.この記事ではポートの選択と接続,切断,テキスト送信を行う機能が実装されています.

hyperts.net

受信したテキストはコンソールに表示するように紹介されていますが,折角なら同じウィンドウ内に表示されるようにしたいところです.直接コントロールを操作してInvokeメソッドを使用する手法は以下の記事を参考にさせていただきました.アプリ側ではシリアルポートでデータを受信したときに動くスレッドとUIスレッドが別々になっているため,Invokeメソッドを使用する必要があります.これをDispatcherと呼ぶそうです.ちなみにUIスレッドへ直接データ受信部を実装すると,実行時にVisual Studioからポップアップでエラーメッセージが表示されます.

guminote.hatenablog.jp

あとは見た目です.XAMLの練習も兼ねて以下2点の機能を加えました.

  • 接続状態を視覚的に明示
  • 接続時は接続解除ボタンのみ有効,接続解除時は接続ボタンのみ有効

こちらの記事の画面イメージを参考にさせていただきました.

thinkami.hatenablog.com

これでアプリは完成です.送受信を兼ねているので,機能的にはArduino IDEのSerial Monitorと変わりありません.

f:id:kayrlas:20190405025522p:plain

Arduino IDEのSerial Monitor

使用方法

以下の画像は左から順にアプリの実行時,接続時,接続解除時の画面イメージです.

f:id:kayrlas:20190405025541p:plain

アプリの画面イメージ

接続方法

シリアルポートが認識されているとプルダウンリストに名称が表示されるので,選択してください.connectボタンを押すと接続が開始されると同時に,connectボタンが無効になります.

送受信方法

Send Dataのテキストボックス内に文字を入力し,sendボタンを押すとテキストが送信されます.受信したテキストはReceived Dataのテキストボックス内に逐次表示されます.

接続解除方法

disconnectボタンを押すと接続が解除され,disconnectボタンが無効になります.アプリを終了させたいときはウィンドウの閉じるボタンを押してください.

ソースコード

コードはGitHubにアップロードしてあります.是非ご覧ください.Arduinoのコードが含まれていますが,シリアル通信で受信したテキストをReceived: の後に続けて送信するようになっています.動作確認にお使いください.通信速度は9600 bpsで固定です.

github.com

まとめ

通信を制御できるようになり,センサから得た値をPCに取り込んで適宜計算させたあと機械制御する道筋がはっきりしました.WPFで作成したリッチなUIの利点を生かして実験も快適に進むと思います.