SerialPort.DataReceived Zdarzenie

Definicja

Wskazuje, że dane zostały odebrane za pomocą portu reprezentowanego przez SerialPort obiekt.Indicates that data has been received through a port represented by the SerialPort object.

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 

Typ zdarzenia

SerialDataReceivedEventHandler

Przykłady

Ten przykład dodaje do, aby SerialDataReceivedEventHandler DataReceived odczytać wszystkie dostępne dane odebrane na porcie COM1.This example adds a SerialDataReceivedEventHandler to DataReceived to read all the available data received on the COM1 port. Należy pamiętać, że w celu przetestowania tego kodu należy dysponować sprzętem podłączonym do portu COM1, który wyśle dane.Note that to test this code it is necessary to have hardware attached to COM1 that will send data.

#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

Uwagi

Zdarzenia danych mogą być spowodowane przez dowolne elementy w SerialData wyliczeniu.Data events can be caused by any of the items in the SerialData enumeration. Ponieważ system operacyjny decyduje o tym, czy zgłosić to zdarzenie, czy nie wszystkie błędy parzystości mogą zostać zgłoszone.Because the operating system determines whether to raise this event or not, not all parity errors may be reported.

DataReceivedZdarzenie jest również zgłaszane w przypadku otrzymania znaku EOF, niezależnie od liczby bajtów w wewnętrznym buforze wejściowym i wartości ReceivedBytesThreshold właściwości.The DataReceived event is also raised if an Eof character is received, regardless of the number of bytes in the internal input buffer and the value of the ReceivedBytesThreshold property.

PinChanged, DataReceived , i ErrorReceived zdarzenia mogą być wywoływane poza kolejnością i może istnieć niewielkie opóźnienie między raportem źródłowym a błędem i po wykonaniu programu obsługi zdarzeń.PinChanged, DataReceived, and ErrorReceived events may be called out of order, and there may be a slight delay between when the underlying stream reports the error and when the event handler is executed. Tylko jeden program obsługi zdarzeń może być wykonywany jednocześnie.Only one event handler can execute at a time.

DataReceivedZdarzenie nie jest gwarantowane dla każdego odebranego bajtu.The DataReceived event is not guaranteed to be raised for every byte received. Użyj BytesToRead właściwości, aby określić, ile danych pozostało do odczytu w buforze.Use the BytesToRead property to determine how much data is left to be read in the buffer.

DataReceivedZdarzenie jest zgłaszane w wątku pomocniczym, gdy dane są odbierane z SerialPort obiektu.The DataReceived event is raised on a secondary thread when data is received from the SerialPort object. Ponieważ to zdarzenie jest zgłaszane w wątku pomocniczym, a nie w wątku głównym, próba zmodyfikowania niektórych elementów w wątku głównym, takich jak elementy interfejsu użytkownika, może wywołać wyjątek wątku.Because this event is raised on a secondary thread, and not the main thread, attempting to modify some elements in the main thread, such as UI elements, could raise a threading exception. Jeśli konieczne jest zmodyfikowanie elementów w głównym Form lub Control , Opublikuj żądania zmiany ponownie przy użyciu Invoke , co spowoduje wykonanie pracy we właściwym wątku.If it is necessary to modify elements in the main Form or Control, post change requests back using Invoke, which will do the work on the proper thread.

Aby uzyskać więcej informacji na temat obsługi zdarzeń, zobacz Obsługa iwywoływanie zdarzeń.For more information about handling events, see Handling and Raising Events.

Dotyczy