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