.NETでのシリアルポート(SerialPort) での受信について(デリゲート)
久々に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
この方はいろいろなフリーソフトを作成されている様です。使えるソフトが満載です。
USB接続をした機器からの情報の取得方法を探してこちらに辿り着きました。
示していただいたコードを参考にデータを受信するプログラムが作れました。ありがとうございます!
投稿: | 2017年3月27日 (月) 07:08