久々にRS232C通信、もといシリアルポートを使ったプログラムを作ったのですが、そこではまった話です。
最近は「RS232C」という規格名も変わったそうですが、「.NET」でのシリアルポートのコントロールも 以前VB6.0あたりで存在した、MSCOMMとは異なりだいぶ進化していました。
(いまどきシリアル通信でもみたいな感じですが、まだまだ需要があるのか、VS2013でもシリアルポートのコントロールは 標準で装備されています。)
最初に簡単なシリアルポートを使ったテストプログラムを作成したのですが、 実行させてみるとそこでいきなりのエラーが発生しました。 下図はプログラムのデバッグ時の画面です。 「有効ではないスレッド間の操作:コントロールが作成されたスレッド以外のスレッドからコントロール'TextBox1'がアクセスされました。」 のエラーが発生しました。
どうも、シリアルポートの受信イベントはフォームが作成された時のスレッドとは別のスレッドで動作する様です。 MSの以下のページによれば、 https://msdn.microsoft.com/ja-jp/library/system.io.ports.serialport.datareceived%28v=vs.110%29.aspx
「DataReceived イベントは、データが SerialPort オブジェクトから受信されたときにセカンダリ スレッドで発生します。... メインの Form または Control で要素を変更する必要がある場合は、Invoke を使用して変更要求をポストバックします。これにより、適切なスレッドで処理が実行されるようになります。」 とあります。
■「シリアルポート」テストソース(バグのあるソース)
結局、デリゲートを使ってInvoke命令で、表示処理を行えばよいことがわかりました。 それで、上記のプログラムでDataReceivedイベントを以下に変更しました。
■「DataReceivedイベント」部分を改良したソース(抜粋)
結果的に以下の様な表示になります。
シリアル通信は送信元が無いとデバッグができないので、仮想的にシリアルポートを2個作成し、 その2個をループバックできる様に仮想的に接続するフリーソフトがあります。 「com0com」というドライバツールで以下のURLからダウンロードできます。
http://sourceforge.net/projects/com0com/
このドライバをインストールすると、COM11、COM12が追加で生成されます。
COM12側の送信プログラムですが、通信テスト用に以下のフリーソフトを使いました。
「のん」さんといわれる方が作成された「RS232Cテストツール」です。
http://homepage2.nifty.com/nonnon/Download/Rs232cTool/index.html
この方はいろいろなフリーソフトを作成されている様です。使えるソフトが満載です。