2011-10-18 184 views
1

私はSerialPortを使用してデバイスと通信しています。デバイスにはRS-485があり、反対側にはRS-232(仮想ポート)があります。デバイスは正しく動作し、データを正しく送受信します。DataReceivedイベントが発生しない場合があります

問題は、DataReceivedイベントが発生しないことがあることです。 System.Timerを使用して10秒に1回データをデバイスに送信します。ほとんどの場合、正常に動作しますが、1〜10分ごとに応答が得られません。その後、2〜4回後にDataReceivedイベントが最後に発生し、データのクラスタが取得されますforはバッファ内にあります)。

私の質問はどのように可能です

私は申し訳ありませんが、私のアプリにはマルチスレッドがありません(メインスレッドとTimer_ElapsedイベントとDataReceivedイベントのスレッドのみ、別のスレッドで発生していると思います)。私のDataReceivedイベントは高速に処理され、並列に発生させるべきではありません(10秒で十分です。デバイスの応答時間が1秒未満です)。私がThread.Sleepを使用すると、それは何とでも繋がらないと確信している場所にあります。

COMポートが他のアプリケーション(そのうちの1つ、接続をテストするために提供されたデバイスの製造元ではありません)を使用して同様の方法でテストすると、ソフトウェアの問題よりもハードウェアになる可能性があります。それがC#で書かれたかのように見えません)。しかし、私はハードウェアでそれほど良いものではありません。おそらく、PCやCOMポートに何か問題があるかもしれません(ビルドインではなく外部です)。あるいは、それはオペレーティングシステムに関連するものかもしれません(私のアプリはWindows Server 2003上で動作するWindowsサービスです)。

答えて

1

ハードウェアの問題であることが判明しました。

デバイスbetwen接続は次のようになります。 デバイス<> RS-485 <>コンバータ1 <> LAN <> Converter2 <> RS-232 <>コンピュータ<>仮想COM

コンバータ1が故障しているように見えます、私のデバイスが送信するデータをクラスタ化して保持します。今私は何が間違っていることを知っている有能な人々に世話をさせることができます:)

おかげで@マッタウドRodatusあなたの助けになります。ラウンドアバウトでのあなたの答えは、正確に何が正確に私のCOMに来ているかを確認するために私を導いた。

+0

なぜあなたは彼にアップフォートを与えませんか? – jgauffin

+0

問題はありません、@アリー。あなたがそれを理解してうれしいです。 –

3

バッファが期待通りにフラッシュされていないように聞こえます。

DataReceivedイベントは、受信したバイトごとに発生することは保証されていません。バッファに読み込まれるデータの量を確認するには、 BytesToReadプロパティを使用します。

は(ところで、DataReceivedイベントが実際にセカンダリスレッドで発生します。)http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived.aspx

を参照してください

あなたはReadBufferSizeReceivedBytesThresholdの特性を微調整しようとしたことがありますか?それが私が調査を開始する場所です。あなたはおおよそのメッセージのサイズを知っていますか? ReceivedBytesThresholdプロパティを、デバイスから受信する予定の最小メッセージサイズのすぐ下に設定することをお勧めします。次に、最後の数バイトを取得してメッセージを完了するために、短いビジー待機時間が必要な場合があります。

+0

私のアプリでReceivedBytesThreshold = 1(デフォルト)。 MSDNによると、ReadBufferSizeは4096より小さくできません。私は不思議なことに、COMポート(わずかに異なる種類のデバイス、普通のRS-232でコンピュータに接続された)と通信する2つのWindowsサービスを同じマシン上で実行しています。うまく動作します。イベントはケースで正しく発生し、実行されます。 3つ目のコードベースはすべて同じですが、3番目のコードはいくつか変更されています。以前のDataReceivedイベントの実行が終了するまでデータが到着しないことを保証するプログラムの構造。 – Arie

関連する問題