SerialPort.DataReceived SerialPort.DataReceived SerialPort.DataReceived SerialPort.DataReceived Event

Определение

Указывает, что данные были получены через порт, представленный объектом SerialPort.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 

Примеры

В этом примере SerialDataReceivedEventHandler добавляется DataReceived в для чтения всех доступных данных, полученных через порт COM1.This example adds a SerialDataReceivedEventHandler to DataReceived to read all the available data received on the COM1 port. Обратите внимание, что для проверки этого кода необходимо, чтобы оборудование подключено к порту COM1, который будет передавать данные.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
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

Комментарии

События данных могут быть вызваны любыми элементами SerialData перечисления.Data events can be caused by any of the items in the SerialData enumeration. Поскольку операционная система определяет, следует ли вызывать это событие или нет, может быть сообщено не все ошибки четности.Because the operating system determines whether to raise this event or not, not all parity errors may be reported.

Событие также вызывается при получении символа EOF, независимо от числа байтов во внутреннем входном буфере и значения ReceivedBytesThreshold свойства. DataReceivedThe 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, и ErrorReceived могут вызываться не по порядку, и может возникнуть небольшая задержка между тем, когда базовый поток сообщает об ошибке и о выполнении обработчика событий.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. В каждый момент времени может выполняться только один обработчик событий.Only one event handler can execute at a time.

DataReceived Событие не гарантируется для каждого полученного байта.The DataReceived event is not guaranteed to be raised for every byte received. BytesToRead Используйте свойство, чтобы определить, сколько данных осталось прочитать в буфере.Use the BytesToRead property to determine how much data is left to be read in the buffer.

Событие возникает во вторичном потоке при получении данных SerialPort от объекта. DataReceivedThe DataReceived event is raised on a secondary thread when data is received from the SerialPort object. Поскольку это событие возникает во вторичном потоке, а не в основном потоке, попытка изменить некоторые элементы в основном потоке, например в элементах пользовательского интерфейса, может вызвать исключение потоковой обработки.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. Если необходимо изменить элементы в основном Form или Control, выполните запросы на изменение обратно с помощью Invoke, что сделает работу в правильном потоке.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.

Дополнительные сведения об обработке событий см. в разделе обработка и вызов событий.For more information about handling events, see Handling and Raising Events.

Применяется к