web-dev-qa-db-ja.com

C#でシリアルポートの受信バッファーをクリアする

C#でシリアルポートの受信バッファーをクリアする方法を知りたいだけです。受信バッファ内のデータが蓄積され続けるようです。たとえば、受信データのフローは、[データA]、[データB]、[データC]です。欲しいデータは【データC】だけです。 [データA]と[データB]を受け取ったら、バッファーをクリアするように考えています。 [データC]を受信した場合のみ処理を続行します。これはC#でそれを行う方法ですか?

13
maniac84

_System.IO.Ports.SerialPort_を使用している場合は、次の2つの方法を使用できます。

DiscardInBuffer()およびDiscardOutBuffer()は、バッファをフラッシュします。

シリアルポートからデータを読み取る場合:

_private void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    if (!this.Open) return; // We can't receive data if the port has already been closed.  This prevents IO Errors from being half way through receiving data when the port is closed.
    string line = String.empty;
    try
    {
        line = _SerialPort.ReadLine();
        line = line.Trim();
       //process your data if it is "DATA C", otherwise ignore
    }
    catch (IOException ex)
    {
        //process any errors
    }
}
_
15
Simon

port.DiscardOutBuffer(); and port.DiscardInBuffer();を使用して、シリアルポートバッファをクリアします。

10
Cdeez

2つのバッファがあります。 1つのバッファはシリアルポートに関連付けられ、もう1つのバッファはポートバッファからのデータがストリーミングされるベースストリームに関連付けられます。 DiscardIn Buffer()は、破棄されたシリアルポートバッファからデータを取得するだけです。読み取るBase Streamにはまだデータがあります。したがって、DiscardInBufferを使用するほかに、SP.BaseStream.Flush()も使用します。これで白紙の状態になりました!大量のデータを取得していない場合は、基本ストリームSP.BaseStream.Dispose()を削除してください。

まだデータ受信イベントを取得しているので、それを読み取って、データを失う危険にさらされることはありません。

5

のように使用できます

port.DiscardOutBuffer();
port.DiscardInBuffer();
port.Close();
port.DataReceived -= new SerialDataReceivedEventHandler(onDataReceived);
port = null;
4
caras