おすすめ本

最近のトラックバック

  • event (夢茶爺&苦茶爺のPC奮戦備忘録)

AccRanking

Ad

« 【自営業者の開業から確定申告】をまとめたページを作成 | メイン | クローズアップ現代・”地図力”が社会を変える! »

2015年2月 2日 (月)

.NETでのシリアルポート(SerialPort) での受信について(デリゲート)

久々にRS232C通信、もといシリアルポートを使ったプログラムを作ったのですが、そこではまった話です。
最近は「RS232C」という規格名も変わったそうですが、「.NET」でのシリアルポートのコントロールも 以前VB6.0あたりで存在した、MSCOMMとは異なりだいぶ進化していました。
(いまどきシリアル通信でもみたいな感じですが、まだまだ需要があるのか、VS2013でもシリアルポートのコントロールは 標準で装備されています。)
最初に簡単なシリアルポートを使ったテストプログラムを作成したのですが、 実行させてみるとそこでいきなりのエラーが発生しました。 下図はプログラムのデバッグ時の画面です。 「有効ではないスレッド間の操作:コントロールが作成されたスレッド以外のスレッドからコントロール'TextBox1'がアクセスされました。」 のエラーが発生しました。

Err1_2

どうも、シリアルポートの受信イベントはフォームが作成された時のスレッドとは別のスレッドで動作する様です。 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イベント」部分を改良したソース(抜粋)

結果的に以下の様な表示になります。

Formr

シリアル通信は送信元が無いとデバッグができないので、仮想的にシリアルポートを2個作成し、 その2個をループバックできる様に仮想的に接続するフリーソフトがあります。 「com0com」というドライバツールで以下のURLからダウンロードできます。
http://sourceforge.net/projects/com0com/

このドライバをインストールすると、COM11、COM12が追加で生成されます。
COM12側の送信プログラムですが、通信テスト用に以下のフリーソフトを使いました。
「のん」さんといわれる方が作成された「RS232Cテストツール」です。
http://homepage2.nifty.com/nonnon/Download/Rs232cTool/index.html
この方はいろいろなフリーソフトを作成されている様です。使えるソフトが満載です。

Rs232c

トラックバック

このページのトラックバックURL:
http://app.mitelog.jp/t/trackback/459161/33149185

.NETでのシリアルポート(SerialPort) での受信について(デリゲート)を参照しているブログ:

コメント

USB接続をした機器からの情報の取得方法を探してこちらに辿り着きました。
示していただいたコードを参考にデータを受信するプログラムが作れました。ありがとうございます!

コメントを投稿