2012-07-20 255 views
10

Solo quiero saber cómo borramos el buffer de recepción de mi puerto serie en C#. Parece que los datos en el búfer de recepción continúan acumulándose. Por ejemplo, el flujo de datos entrantes es: [Datos A], [Datos B], [Datos C]. La información que quiero es solo [Datos C]. Estoy pensando en hacer algo así, cuando recibo [Datos A] y [Datos B], hago un buffer claro. Solo cuando se recibe [Datos C], continúo el proceso. ¿Es esta la manera de hacerlo en C#?Limpiar el buffer de recepción del puerto serial en C#

+0

¿Cómo está utilizando el puerto serie? ¿Estás usando 'System.IO.Ports.SerialPort'? – Dai

Respuesta

12

Si está utilizando el System.IO.Ports.SerialPort entonces usted podría utilizar los dos métodos:

DiscardInBuffer()DiscardOutBuffer() y para eliminar los topes.

Si está leyendo los datos de un puerto serie:

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

Gracias por la ayuda. Mi transmisor siempre transmitirá datos. Es solo que el receptor que es mi programa C# no siempre recibe los datos para procesar. Si no procesé los datos, el búfer de recepción acumulará los datos, ¿verdad? Entonces, ¿tendré que hacer siempre DiscardInBuffer() cuando no esté procesando los datos recibidos? – maniac84

+0

@ maniac84 Sí, esto debería estar bien. Alternativamente, podría leer el búfer y, en la lógica de su aplicación, simplemente ignorar los datos recibidos. ¿Siempre hay un personaje de terminación similar? Ver mi edición – Simon

7

Uso port.DiscardOutBuffer(); and port.DiscardInBuffer(); para borrar las memorias intermedias de puerto serie

2

puede utilizar como

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

Hay dos memorias intermedias. Un buffer está asociado con el puerto serie y el otro con su flujo base, donde se transmiten los datos del buffer del puerto. DiscardIn Buffer() solo obtiene los datos del buffer del puerto serie descartados. Todavía hay datos en el flujo base que leerá. Entonces, además de usar DiscardInBuffer, también use SP.BaseStream.Flush(). ¡Ahora tienes un borrón y cuenta nueva! Si no obtiene muchos datos, simplemente elimine la secuencia base: SP.BaseStream.Dispose().

Como todavía está recibiendo el evento de datos recibidos, puede leerlo y no correr el riesgo de perder datos.