web-dev-qa-db-fra.com

C # en lecture seule Port série lorsque les données arrivent

Je veux lire mon port série mais uniquement lorsque des données arrivent (je ne veux pas interroger).

Voilà comment je le fais.

                Schnittstelle = new SerialPort("COM3");
                Schnittstelle.BaudRate = 115200;
                Schnittstelle.DataBits = 8;
                Schnittstelle.StopBits = StopBits.Two;
             ....

Et puis je commence un fil

             beginn = new Thread(readCom);
             beginn.Start();

et dans mon readCom je lis en continu (polling :()

private void readCom()
    {

        try
        {
            while (Schnittstelle.IsOpen)
            {

                Dispatcher.BeginInvoke(new Action(() =>
                {

                    ComWindow.txtbCom.Text = ComWindow.txtbCom.Text + Environment.NewLine + Schnittstelle.ReadExisting();
                    ComWindow.txtbCom.ScrollToEnd();
                }));

                beginn.Join(10);

            }
        }
        catch (ThreadAbortException) 
        {

        }

        catch (Exception ex)
        {
            System.Windows.Forms.MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

Je veux que vous lisiez quand une interruption arrive. Mais comment faire ça?

8
user2261524

Vous devrez ajouter un gestionnaire d'événements à l'événement DataReceived.

Voici un exemple de msdn.Microsoft.com, avec quelques modifications: voir commentaires !:

public static void Main()
{
    SerialPort mySerialPort = new SerialPort("COM1");

    mySerialPort.BaudRate = 9600;
    mySerialPort.Parity = Parity.None;
    mySerialPort.StopBits = StopBits.One;
    mySerialPort.DataBits = 8;
    mySerialPort.Handshake = Handshake.None;

    mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

    mySerialPort.Open();

    Console.WriteLine("Press any key to continue...");
    Console.WriteLine();
    Console.ReadKey();
    mySerialPort.Close();
}

private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
    SerialPort sp = (SerialPort)sender;
    string indata = sp.ReadExisting();
    Debug.Print("Data Received:");
    Debug.Print(indata);
}

Chaque fois que des données entrent, le DataReceivedHandler déclenche et imprime vos données sur la console. Je pense que vous devriez pouvoir le faire dans votre code.

34
Eric Smekens

vous devez vous abonner à l'événement DataReceived avant d'ouvrir le port, puis écouter cet événement lorsqu'il est déclenché.

    private void OpenSerialPort()
    {
        try
        {
            m_serialPort.DataReceived += SerialPortDataReceived;
            m_serialPort.Open();
        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.WriteLine(ex.Message + ex.StackTrace);
        }
    } 

    private void SerialPortDataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        var serialPort = (SerialPort)sender;
        var data = serialPort.ReadExisting();
        ProcessData(data);
    }

En série, lorsqu'il y a des données dans le tampon, l'événement de données reçues est déclenché, cela ne signifie pas que vous avez obtenu toutes vos données à la fois. Vous devrez peut-être attendre plusieurs fois pour obtenir toutes vos données; c'est là que vous devez traiter les données reçues séparément, peut-être les conserver quelque part dans le cache avant de procéder au traitement final.

5
Jegan