2010-12-27 21 views
1

私はこの問題で一日戦ってきましたが、答えが見つかりません。 コンパクトフレームワークC#のGPSデバイストラフCOMポートからデータを読み取ろうとしています。私はSerialPortクラスを使用しています(実際に私自身のComPortクラスボクシングSerialPortが、私は必要な2つのフィールドだけを追加、何も特別)。Thread.Sleep()が狂ってしまった後のSerialPort ReadLine()

とにかく、私は別のスレッドのためにCPUが必要なので、ポートからラインを読み込み、NMEAデータを分析して印刷し、すべての例外をキャッチしてからスリープ(200)スレッドをループする別のスレッドで実行しています。 ...睡眠がなければ、それは正常に動作しますが、私は、数分後にスリープを使用しない場合は、COMポートからの出力は次のようになります。.. 100%のCPUを使用しています。

GPGSA、A、3,09,12、 22,17,15,27 ,,,,,, 2.6,1.6,2.1 * 3F
GSA、A、3,09,12,22,17,15,27 ,,,,, 2.6,1.6 、2.1 * 3F
A、A、3,09,12,22,17,15,27 ,,,,, 2.6,1.6,2.1 * 3F
,1812,271,24,24,05,020、 24,14,04 、326,25,11,03,023、* 76
A、3,09,12,22,17,15,27 ,,,,, 2.6,1.6,2.1 * 3F
3,09,12、 22,17,15,27 ,,,,,,, 2.6,1.6,2.1 * 3F
09,12,22,17,15,27 ,,,,,, 2.6,1.6,2.1 * 3F
、2.6,1.6,2.1 ,,,,,,, 12,22,17,15,27 * 3F

あなたが見ることができるように同じメッセージが数回を読んでますがをカットされます。 私は マイポート設定...私が間違ってやっているのだろうか:デバイスがある場合は、再接続のように、この機能では、いくつかのより多くのものがあります

private void processGps(){ 
    while (!closing) 
    { 
     //reconnect if needed 
     try 
     { 
      string sentence = port.ReadLine(); 
      //here print the sentence 
      //analyze the sentence (this takes some time 50-100ms) 
     } 
     catch (TimeoutException) 
     { 
      Thread.Sleep(0); 
     } 
     catch (IOException ioex) 
     { 
      //handling IO exception (some info on the screen) 
     } 
    Thread.Sleep(200); 
    } 
} 

port.ReadBufferSize = 4096; 
port.BaudRate = 4800; 
port.DataBits = 8; 
port.Parity = Parity.None; 
port.StopBits = StopBits.One; 
port.NewLine = "\r\n"; 
port.ReadTimeout = 1000; 
port.ReceivedBytesThreshold = 100000; 

そして、私の読み取り機能GPSが正しく接続されていれば呼び出されません。私は(TimeoutExceptionで、後にお読みください。)コードの一部のブロックの後に

port.DiscardInBuffer(); 

をしようとしていた

は誰もが同じような問題があったのか?私は間違ってやっていることを本当に知っていない。それのリグを取得する唯一の方法は、最後の睡眠を取り除くことです。

+0

あなたの代わりに睡眠の非同期操作を検討したことがありますか? – ongle

答えて

1

同様の問題を抱えているすべての人のために。最初の問題は、バッファのオーバーフローに関するものでした。私は4096サイズのバッファを持っていたので、データはちょうどそこを流れていたので、壊れた文章を読んでいました。今すぐすべてのバッファを読み込んで分析します。最初の文は時々破損しますが、残りは大丈夫です。
2番目の問題はデバイスの問題でした。 Tom Tom MkIIはデバイスとの接続を失うことがあります。私はGPSを再起動して、Btデバイスのリストで再度それを見つけなければなりませんでした。 よろしくお願いいたします。

0

どのようにしてハンドシェイクをしているのかはあなたの投稿には何もありません。

通常、ソフトウェア(XON/XOFF)またはハードウェア(RTS/CTSなど)ハンドシェイクを使用して、シリアルポートがより多くのデータを受信できないときに送信を停止するよう指示します。ハンドシェイク構成は、(もちろん)送信装置の構成と一致しなければならない。

あなたは正しくハンドシェーク構成に失敗した場合は、限り、あなたは十分に速くデータを処理しているとして、それで逃げること - しかし、あなたは睡眠を持っている場合、データが失われる可能性があります。

関連する問題