私はこの問題で一日戦ってきましたが、答えが見つかりません。 コンパクトフレームワーク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();
をしようとしていた
は誰もが同じような問題があったのか?私は間違ってやっていることを本当に知っていない。それのリグを取得する唯一の方法は、最後の睡眠を取り除くことです。
あなたの代わりに睡眠の非同期操作を検討したことがありますか? – ongle