13

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

4

4 に答える 4

17

を使用している場合は、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
    }
}
于 2012-07-20T01:26:38.963 に答える
12

port.DiscardOutBuffer(); and port.DiscardInBuffer();シリアルポートバッファをクリアするために使用します

于 2012-07-20T11:09:33.370 に答える
5

あなたはのように使うことができます

port.DiscardOutBuffer();
port.DiscardInBuffer();
port.Close();
port.DataReceived -= new SerialDataReceivedEventHandler(onDataReceived);
port = null;
于 2015-12-29T11:45:49.557 に答える
5

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

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

于 2017-09-17T04:19:08.233 に答える