SerialPort.DataReceived Evento

Definição

Indica que os dados foram recebidos por meio de uma porta representada pelo objeto 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 de evento

Exemplos

Este exemplo adiciona um SerialDataReceivedEventHandler a para DataReceived ler todos os dados disponíveis recebidos na porta COM1. Observe que, para testar esse código, é necessário ter o hardware anexado ao COM1 que enviará dados.

#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

Comentários

Os eventos de dados podem ser causados por qualquer um dos itens na SerialData enumeração . Como o sistema operacional determina se deve ou não gerar esse evento, nem todos os erros de paridade podem ser relatados.

O DataReceived evento também será gerado se um caractere Eof for recebido, independentemente do número de bytes no buffer de entrada interno e do valor da ReceivedBytesThreshold propriedade.

PinChangedOs eventos , DataReceivede ErrorReceived podem ser chamados fora de ordem e pode haver um pequeno atraso entre quando o fluxo subjacente relata o erro e quando o manipulador de eventos é executado. Somente um manipulador de eventos pode ser executado por vez.

Não DataReceived há garantia de que o evento seja gerado para cada byte recebido. Use a BytesToRead propriedade para determinar quantos dados restam para serem lidos no buffer.

O DataReceived evento é gerado em um thread secundário quando os dados são recebidos do SerialPort objeto . Como esse evento é gerado em um thread secundário e não no thread main, tentar modificar alguns elementos no thread main, como elementos de interface do usuário, poderia gerar uma exceção de threading. Se for necessário modificar elementos no main Form ou Control, poste solicitações de alteração novamente usando Invoke, o que fará o trabalho no thread adequado.

Para obter mais informações sobre como lidar com eventos, consulte Manipulando e gerando eventos.

Aplica-se a