web-dev-qa-db-fra.com

Effacer le tampon de réception du port série en C #

Je veux juste savoir comment effacer le tampon de réception de mon port série en C #. Il semble que les données du tampon de réception continuent de s'accumuler. Par exemple, le flux de données entrantes est le suivant: [Données A], [Données B], [Données C]. Les données que je veux sont simplement [Data C]. Je pense faire comme, quand je reçois [Data A] et [Data B], je fais un tampon clair. Ce n'est que lorsque [Data C] est reçu, je continue le processus. Est-ce la façon de le faire en C #?

13
maniac84

Si vous utilisez le System.IO.Ports.SerialPort, Vous pouvez utiliser les deux méthodes:

DiscardInBuffer() et DiscardOutBuffer() pour vider les tampons.

Si vous lisez les données d'un port série:

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

Utilisez port.DiscardOutBuffer(); and port.DiscardInBuffer(); pour effacer les tampons du port série

10
Cdeez

Il y a deux tampons. Un tampon est associé au port série et l'autre à son flux de base, dans lequel les données du tampon de port sont diffusées. DiscardIn Buffer () obtient simplement les données du tampon du port série rejetées. Il y a encore des données dans le flux de base que vous lirez. Ainsi, en plus d'utiliser DiscardInBuffer, utilisez également SP.BaseStream.Flush (). Maintenant, vous avez une table rase! Si vous n'obtenez pas beaucoup de données, supprimez simplement le flux de base: SP.BaseStream.Dispose ().

Puisque vous recevez toujours l'événement de données reçues, vous pouvez le lire et ne pas vous mettre en danger de perdre des données.

5
Rajesh Maheshwari

vous pouvez utiliser comme

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