シリアルポートコミュニケーション:ポーリングシリアルポートvsシリアルポートの使用DataReceivedイベント
-
22-07-2019 - |
質問
私の見直し一部のコードに書いた通信シリアルポートクライアントまで、フルのC#にCF2.0になります。を利用していませんDataReceivedイベントで信頼性に欠ける。 MSDNる:
のDataReceivedイベントではない gauranteedされるバイト を受信します。利用のBytesToRead物件 どのデータは 読み込み、バッファです。
私は投票のポートを書いを委譲するプロセスのデータで読み出します。読んだもののどこかにする"ポーリングが悪い"(解説).
そのアイデアはなぜポーリングが悪い?ほかのスレッド上の注意-私は別のスレッドのバックグラウンドのスレッド)の世論調査のポートには、スレッドが終了した後に読み込むデータは、すべての試験および作業性に優れています。
解決
これを読むと、1バイトあたり1つのイベントではなく、複数バイトで1つのイベントを取得する可能性があります。データの準備ができたときにイベントを取得し、「スキップ」しないようにする予定です。完全に数バイト。
このイベントは常に使用しており、問題はありませんでした。
他のヒント
従来の知恵である"ポーリングが悪いのではなくて、最終的にa CPU-行きます。場合はブロックI/Oを使用し、CPUはその他のプロセスまでのイベントなどが挙げられる。
とこともできるものをセットで投票を待ち(短い)タイムアウトを返す前にいないときに文字が可能です。場合に適したタイムアウトが選択され、その後簡単なポーリングループの使用を大幅に低CPU時間,およびその他のプロセスを取得します。
でおすすめシリアルポートからC#、がんの危険かを当てるというものがどのよう
のDataReceivedイベントであることが保証されていない上げバイトを受信します。使用 のBytesToRead性の決定にはどのくらいデータが読み込まれる、バッファです。
は大きな期待はできなかった。この状況下でのイベント以上の文字が可能です。単に取得する利用可能な全ての文字のイベントハンドラは、すべてます。
編集: ってブロッキングコースレッドが最良の答えます。なポーリング自体以降のスレッドが文字まで遮断されます。必要がある場合がありますチューニングのバッファサイズのシリアルポート設定が必要な場合にデータを加工で着による固定サイズのチャンク.
ブロッキング読み取り呼び出しを使用している場合でも、基になるシリアルポートドライバーコードは割り込み駆動型であると確信しています。