私は.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よりも異なるようだ...
Xon/Xoffまたはハードウェアハンドシェイクを使用していますか –
.NETのSerialPortクラスのデフォルト値は何でも使用しています。私はそれを試してみよう:) – anonymous
あなたのシリアルデバイスはボタンを押して通信をしない場合は再送するのですか? –