Поделиться через


SerialPort.DataReceived Событие

Определение

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

Тип события

Примеры

В этом примере добавляется SerialDataReceivedEventHandler для DataReceived чтения всех доступных данных, полученных через порт COM1. Обратите внимание, что для тестирования этого кода необходимо иметь оборудование, подключенное к COM1, которое будет отправлять данные.

#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

Комментарии

События данных могут быть вызваны любым из элементов перечисления SerialData . Так как операционная система определяет, следует ли вызывать это событие, могут возникать не все ошибки четности.

Событие DataReceived также возникает при получении символа Eof, независимо от количества байтов во внутреннем входном буфере и значения ReceivedBytesThreshold свойства .

PinChangedСобытия , DataReceivedи ErrorReceived могут вызываться не по порядку, и может быть небольшая задержка между тем, когда базовый поток сообщает об ошибке, и выполнением обработчика событий. Одновременно может выполняться только один обработчик событий.

Событие DataReceived не гарантируется для каждого полученного байта. Используйте свойство , BytesToRead чтобы определить, сколько данных осталось прочитать в буфере.

Событие DataReceived возникает во вторичном потоке при получении данных из SerialPort объекта . Так как это событие возникает во вторичном потоке, а не в потоке main, попытка изменить некоторые элементы в потоке main, например элементы пользовательского интерфейса, может вызвать исключение потока. Если необходимо изменить элементы в main Form или Control, отправить запросы на изменение обратно с помощью Invoke, который будет выполнять работу в правильном потоке.

Дополнительные сведения об обработке событий см. в разделе Обработка и вызов событий.

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