C#でシリアルポートの受信バッファをクリアする方法を知りたいだけです。受信バッファ内のデータが蓄積し続けているようです。たとえば、受信データのフローは、[データA]、[データB]、[データC]です。欲しいデータは[データC]だけです。[データA]と[データB]を受け取ったときに、バッファをクリアするようなことを考えています。[データC]を受信した場合のみ処理を続行します。これはC#でそれを行う方法ですか?
4 に答える
を使用している場合は、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
}
}
port.DiscardOutBuffer(); and port.DiscardInBuffer();
シリアルポートバッファをクリアするために使用します
あなたはのように使うことができます
port.DiscardOutBuffer();
port.DiscardInBuffer();
port.Close();
port.DataReceived -= new SerialDataReceivedEventHandler(onDataReceived);
port = null;
2つのバッファがあります。一方のバッファはシリアルポートに関連付けられ、もう一方はそのベースストリームに関連付けられ、ポートバッファからのデータがにストリーミングされます。DiscardIn Buffer()は、破棄されたシリアルポートバッファからデータを取得するだけです。ベースストリームには、読み取るデータがまだあります。したがって、DiscardInBufferを使用する以外に、SP.BaseStream.Flush()も使用します。これで、きれいな状態になりました。大量のデータを取得していない場合は、ベースストリームSP.BaseStream.Dispose()を削除するだけです。
あなたはまだデータ受信イベントを取得しているので、あなたはそれを読むことができ、データを失う危険にさらされることはありません。