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