2011-02-01 11 views
1

私は.NET SerialPortクラスを使用してゲージと通信しています。ゲージ上のボタンを押すたびに、読み取り値がポートを介して送信されます。SerialPort - 既存のデータを消去

問題は、プログラムがオフになっているときにゲージのボタンを押すと、プログラムが起動するときに、その既存のデータの受信イベントが発生するということです。私はこの振る舞いを望んでいません - 私は、ポートが開かれた後に行われた読みを収集したいだけです。

私はThread.Sleepを使用して現在の回避策を持っていますが、それはハッキーのように思われ、誰かがより良い解決策を知っているのだろうかと思っています。

port = New SerialPort("COM1", 9600, Parity.None, 8, StopBits.One) 

port.Open() 
port.DtrEnable = True 

System.Threading.Thread.Sleep(100) 
port.ReadExisting() 

AddHandler port.DataReceived, AddressOf PortDataReceived 

私がThread.Sleepを持っていない場合、以前のゲージデータに対してDataReceivedイベントが発生します。これは、ReadExistingがブロックされていないので、開いた直後に呼び出されたときには何も読み取られないためです。あなたは 'port.BytesToRead()' を呼び出した場合

おかげ


だから直後にそのゼロを開きます。 100ms後にそれを呼び出すと、その非ゼロを開いてください。私はこれが理にかなっていると思う - 開いた後、既存のデータを読むのに時間がかかる。

別のオプションは、読み取りタイムアウトを読み、設定を呼び出すことですが、あなたは、例外をキャッチする必要があり除き、それはのThread.sleepよりも異なるようだ...

+0

Xon/Xoffまたはハードウェアハンドシェイクを使用していますか –

+0

.NETのSerialPortクラスのデフォルト値は何でも使用しています。私はそれを試してみよう:) – anonymous

+0

あなたのシリアルデバイスはボタンを押して通信をしない場合は再送するのですか? –

答えて

1
port.DtrEnable = True 

副作用を有することができること。ゲージが上下に飛び降りて読書を送ることを熱望しているかもしれません。結局のところ、誰かがボタンを押して送信するのがいいと言っていました。しかし、その送信ルーチンはハンドシェークプロトコルを監視しており、Data Terminal Readyはオンではありません。ジャンプ、ジャンプ、ああ!それは続いている。送信します。それには時間がかかるが、ボーレートに依存する。

コンピュータが準備できていないのに、誰かがボタンを押したのはなぜですか?なぜそれが準備ができていないのですか?その質問に答えたら、スリープ()を削除できます。また、コンピュータの準備が整う前に何度かボタンを押したときに何が起こるかを調べる。あなたの睡眠は短すぎるかもしれません。

+0

私はシリアルポートエクスポートではありません。 DTRをオンにすると、開いた状態でデバイスにコマンドが送信されますか?もしそうなら、それは完全に意味をなさない。 (その行がなければ私はデータbtwを受け取ることはありません)。それを何回も押すと違いはないようです。読み取りまで1つの結果しか保存しません。そう、10回押すと、ゲージから1つのメッセージが読み上げられます。少なくともこの特定のゲージ: – anonymous

+0

2番目の部分(なぜプログラムを使わずにボタンを押してください)に答えるには - 私は偶然の使い方をしたいだけです。そのゲージ校正ログプログラムは、値を記録するために起動します。私はちょうど混乱がないことを確実にしたい - 彼らはプログラムを起動し、既に入力された値を見ない。 – anonymous

+0

これは大丈夫です、誰も特に100ミリ秒に気づくことはありません。それ以来、ボタンが押されていないにもかかわらず、あなたのプログラムが起動後に読書を表示しても、彼らは不平を言うことはありません。これは本当の問題にはなりません。あなたのユーザーを教育し、彼らは "ああ、意味がある"に行くでしょう。 –

0

シリアルポートのアウトバッファで待っているものを収集する必要がない場合は、 serialPort.DiscardWriteBuffer() serialPort.DiscardOutBuffer()を呼び出して、そこに収集されたものをすべてクリアする必要があります。チャドは私のエラーを修正してくれてありがとう。

+0

'serialPort.DiscardOutBuffer()'ではありませんか? – Chad

関連する問題