Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Clear serial port receive buffer in C#

Tags:

c#

serial-port

Just want to know how do we clear the receive buffer of my serial port in C#. Seems like the data in the receive buffer just keep accumulating. For example, the flow of incoming data is: [Data A], [Data B], [Data C]. The data I want is just [Data C]. I'm thinking of doing like, when I receive [Data A] and [Data B], I do a clear buffer. Only when [Data C] is received, I continue process. Is this the way to do it in C#?

like image 336
maniac84 Avatar asked Jul 20 '12 01:07

maniac84


4 Answers

There are two buffers. One buffer is associated with the serial port and the other with its base stream, where data from the port buffer is streamed into. DiscardIn Buffer() just gets data from the Serial Port buffer discarded. There is still data in the Base Stream that you will read. So, besides using DiscardInBuffer, also use SP.BaseStream.Flush(). Now you have a clean slate! If you are not getting a lot of data, simply get rid of the base stream: SP.BaseStream.Dispose().

Since you are still getting the data received event, yo can read it and not put yourself in jeopardy of losing data.

like image 116
Rajesh Maheshwari Avatar answered Nov 17 '22 19:11

Rajesh Maheshwari


Use port.DiscardOutBuffer(); and port.DiscardInBuffer(); to clear the serial port buffers

like image 24
Cdeez Avatar answered Nov 17 '22 18:11

Cdeez


If you are using the System.IO.Ports.SerialPort then you could use the two methods:

DiscardInBuffer() and DiscardOutBuffer() to flush the buffers.

If you are reading the data from a serial port:

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
    }
}
like image 17
Simon Avatar answered Nov 17 '22 18:11

Simon


you can use like

port.DiscardOutBuffer();
port.DiscardInBuffer();
port.Close();
port.DataReceived -= new SerialDataReceivedEventHandler(onDataReceived);
port = null;
like image 5
Caner Avatar answered Nov 17 '22 20:11

Caner