Condividi tramite


SerialPort.DataReceived Evento

Definizione

Indica che i dati sono stati ricevuti tramite una porta rappresentata dall'oggetto SerialPort.

public:
 event System::IO::Ports::SerialDataReceivedEventHandler ^ DataReceived;
public event System.IO.Ports.SerialDataReceivedEventHandler DataReceived;
member this.DataReceived : System.IO.Ports.SerialDataReceivedEventHandler 
Public Custom Event DataReceived As SerialDataReceivedEventHandler 
Public Event DataReceived As SerialDataReceivedEventHandler 

Tipo evento

Esempio

In questo esempio viene aggiunto un SerialDataReceivedEventHandler oggetto per DataReceived leggere tutti i dati disponibili ricevuti nella porta COM1. Si noti che per testare questo codice è necessario disporre dell'hardware collegato a COM1 che invierà dati.

#using <System.dll>

using namespace System;
using namespace System::IO::Ports;

ref class PortDataReceived
{
public:
    static void Main()
    {
        SerialPort^ mySerialPort = gcnew SerialPort("COM1");

        mySerialPort->BaudRate = 9600;
        mySerialPort->Parity = Parity::None;
        mySerialPort->StopBits = StopBits::One;
        mySerialPort->DataBits = 8;
        mySerialPort->Handshake = Handshake::None;
        mySerialPort->RtsEnable = true;

        mySerialPort->DataReceived += gcnew 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();
        Console::WriteLine("Data Received:");
        Console::Write(indata);
    }
};

int main()
{
    PortDataReceived::Main();
}
using System;
using System.IO.Ports;

class PortDataReceived
{
    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.RtsEnable = true;

        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();
        Console.WriteLine("Data Received:");
        Console.Write(indata);
    }
}
Imports System.IO.Ports

Class PortDataReceived
    Public Shared Sub Main()
        Dim mySerialPort As New SerialPort("COM1")

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

        AddHandler mySerialPort.DataReceived, AddressOf DataReceivedHandler

        mySerialPort.Open()

        Console.WriteLine("Press any key to continue...")
        Console.WriteLine()
        Console.ReadKey()
        mySerialPort.Close()
    End Sub

    Private Shared Sub DataReceivedHandler(
                        sender As Object,
                        e As SerialDataReceivedEventArgs)
        Dim sp As SerialPort = CType(sender, SerialPort)
        Dim indata As String = sp.ReadExisting()
        Console.WriteLine("Data Received:")
        Console.Write(indata)
    End Sub
End Class

Commenti

Gli eventi di dati possono essere causati da uno qualsiasi degli elementi nell'enumerazione SerialData . Poiché il sistema operativo determina se generare questo evento o meno, non tutti gli errori di parità possono essere segnalati.

L'evento DataReceived viene generato anche se viene ricevuto un carattere Eof, indipendentemente dal numero di byte nel buffer di input interno e dal valore della ReceivedBytesThreshold proprietà.

PinChanged, e DataReceivedErrorReceived gli eventi possono essere chiamati fuori ordine e potrebbe verificarsi un lieve ritardo tra quando il flusso sottostante segnala l'errore e quando viene eseguito il gestore eventi. Un solo gestore eventi può essere eseguito alla volta.

L'evento DataReceived non è garantito che venga generato per ogni byte ricevuto. Utilizzare la proprietà per determinare la BytesToRead quantità di dati da leggere nel buffer.

L'evento DataReceived viene generato in un thread secondario quando i dati vengono ricevuti dall'oggetto SerialPort . Poiché questo evento viene generato in un thread secondario e non nel thread principale, tentando di modificare alcuni elementi nel thread principale, ad esempio gli elementi dell'interfaccia utente, potrebbe generare un'eccezione di threading. Se è necessario modificare gli elementi nel thread principale Form o Control, pubblicare le richieste di modifica indietro usando Invoke, che eseguirà il lavoro nel thread appropriato.

Per ulteriori informazioni sulla gestione degli eventi, consultare gestione e generazione di eventi.

Si applica a