Подтвердить что ты не робот

Очистить буфер приема последовательного порта в С#

Просто хочу знать, как очистить буфер приема моего последовательного порта на С#. Похоже, данные в буфере приема просто продолжают накапливаться. Например, поток входящих данных: [Данные A], [Данные B], [Данные C]. Данные, которые я хочу, это просто [Данные C]. Я думаю, что, когда я получаю [данные A] и [данные B], я делаю чистый буфер. Только когда получен [Data C], я продолжаю процесс. Это способ сделать это на С#?

4b9b3361

Ответ 1

Если вы используете System.IO.Ports.SerialPort, вы можете использовать два метода:

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
    }
}

Ответ 2

Используйте port.DiscardOutBuffer(); and port.DiscardInBuffer(); для очистки буферов последовательного порта

Ответ 3

вы можете использовать как

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

Ответ 4

Есть два буфера. Один буфер связан с последовательным портом, а другой - с его базовым потоком, куда поступают данные из буфера портов. DiscardIn Buffer() только что удаляет данные из буфера последовательного порта. В базовом потоке есть все еще данные, которые вы будете читать. Итак, помимо использования DiscardInBuffer, также используйте SP.BaseStream.Flush(). Теперь у вас есть чистый список! Если вы не получаете много данных, просто избавляйтесь от базового потока: SP.BaseStream.Dispose().

Поскольку вы все еще получаете полученное данные, вы можете прочитать его и не подвергать себя риску потери данных.