質問: "\r\n"; do { //1byteずつ受信(1文字ずつ) StrLDReceiveData += ((char)(SerialPortPLC.ReadChar())).ToString(); } while (StrLDReceiveData[StrLDReceiveData.Length - 1] != Delimiter[Delimiter.Length - 1]); } while (SerialPortPLC.BytesToRead != 0); } ``` 1、2の受信方法でデータ欠損の発生状況を確認しましたが、12においても発生状況は変わりませんでした。 (ただし、2の方法では、割り込み優先度を上げる対策を行っての検証は実施していません。) 【追記】 GUIアプリケーションです。 送信は専用スレッドで動かしています。 上記、受信のイベントハンドラはメインスレッド上です。
回答: 提示された部分程度のプログラムでは、データの取りこぼしが発生するほどの負荷は無いでしょう。 DataReceivedハンドラでどちらの方法を取っても状況が変わらないことが、それを示しています。 強いて言えば、以下の点が気になるところです。 * 「タイムアウト値 1秒」は、PLC装置の仕様書等に記載された、根拠のある数値ですか? * 入出力バッファをクリアしてから?コマンド送信を行っているようですが、これでデータが削除されることはありませんか? つまり、コマンドを送信しない限り、PLCからのデータが発生することは無い、ということが保証されていますか? * 前のコマンドに対するデータ受信が完了する前に次のコマンド送信を行っていませんか? * ご自身の紹介先記事にあるように、.NETの受信バッファSerialPort.ReadBufferSize Propertyのサイズは十分に取られていますか?(発生する可能性のある受信データの最大長以上のサイズになっていますか?) * ErrorReceivedは実装されていますか? それが呼ばれている、ということはありませんか? * 2の方法を取るなら、1文字づつReadCharするより、BytesToReadサイズ分を1回のReadで読みましょう 他には、質問記事には書かれていない、アプリケーションのこれ以外の部分で以下のような処理が無いかチェックしてみてください。あればそれらがデータ受信に影響無いように対処してください。 * DataReceivedハンドラの中で画面/ファイル/データベース/サーバー等へのデータ出力を行っている * 同じくDataReceivedハンドラの中で複雑な統計処理等を行っている * 同じくDataReceivedハンドラの中で何か時間の掛かる処理をLock等の排他状態で行っている * 同一アプリケーションまたは同一PCの他プロセスの中で、ある程度データが溜まった等をトリガに、上記に関連する高負荷の処理が行われる ちなみに、可能ならばC#のスクラッチでプログラムを作るよりも、メーカーの用意している開発環境/ライブラリ/ツールを使った方が良いと思われます。 性能・機能に関しては検証済みでしょうし、何か問題があっても対処してくれるはずです。 おそらくこれらのものが関連するソフトウェアではないでしょうか? ソフトウェア - 商品カテゴリ|オムロン制御機器 FA統合ツールパッケージ CX-One Sysmac Library 代官山32(簡易データ収集ソフト)