SerialPort.DataReceived Zdarzenie

Definicja

Wskazuje, że dane zostały odebrane za pośrednictwem portu reprezentowanego SerialPort przez obiekt.

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

Przykłady

W tym przykładzie dodano element do SerialDataReceivedEventHandler odczytu DataReceived wszystkich dostępnych danych odebranych na porcie COM1. Należy pamiętać, że aby przetestować ten kod, konieczne jest posiadanie sprzętu dołączonego do modelu COM1, który będzie wysyłać dane.

#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 wyliczenie SerialData . Ponieważ system operacyjny określa, czy należy zgłosić to zdarzenie, czy nie wszystkie błędy parzystości mogą być zgłaszane.

Zdarzenie DataReceived jest również wywoływane, jeśli zostanie odebrany znak Eof, niezależnie od liczby bajtów w wewnętrznym buforze wejściowym i wartości ReceivedBytesThreshold właściwości.

PinChanged, DataReceivedi ErrorReceived zdarzenia mogą być wywoływane z kolejności i może wystąpić niewielkie opóźnienie między tym, gdy bazowy strumień zgłasza błąd i kiedy program obsługi zdarzeń jest wykonywany. Tylko jedna procedura obsługi zdarzeń może być wykonywana jednocześnie.

Nie DataReceived ma gwarancji, że zdarzenie zostanie podniesione dla każdego odebranych bajtów. Użyj właściwości , BytesToRead aby określić ilość danych do odczytu w buforze.

Zdarzenie DataReceived jest wywoływane w wątku pomocniczym, gdy dane są odbierane z SerialPort obiektu. Ponieważ to zdarzenie jest wywoływane w wątku pomocniczym, a nie głównym wątku, 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ątkowy. Jeśli konieczne jest zmodyfikowanie elementów w obiekcie głównym Form lub Control, opublikuj żądania zmiany z powrotem przy użyciu polecenia Invoke, co spowoduje wykonanie pracy nad odpowiednim wątkiem.

Aby uzyskać więcej informacji na temat obsługi zdarzeń, zobacz Obsługa i podnoszenie zdarzeń.

Dotyczy