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 

이벤트 유형

예제

이 예제에서는 를 에 DataReceived 추가하여 COM1 포트에서 받은 사용 가능한 모든 데이터를 읽습니다SerialDataReceivedEventHandler. 이 코드를 테스트하려면 데이터를 보낼 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 내부 입력 버퍼의 바이트 수와 속성 값 ReceivedBytesThreshold 에 관계없이 Eof 문자가 수신되는 경우에도 이벤트가 발생합니다.

PinChanged, DataReceivedErrorReceived 이벤트가 순서대로 호출될 수 있으며 기본 스트림이 오류를 보고하는 시기와 이벤트 처리기가 실행되는 시점 사이에 약간의 지연이 있을 수 있습니다. 한 번에 하나의 이벤트 처리기만 실행할 수 있습니다.

이벤트가 DataReceived 수신된 모든 바이트에 대해 발생하도록 보장되지는 않습니다. 사용 된 버퍼에서 BytesToRead 읽을 수 있도록 남아 있는 데이터의 양을 결정 하는 속성입니다.

이벤트는 DataReceived 개체에서 데이터를 받을 때 보조 스레드에서 SerialPort 발생합니다. 이 이벤트는 기본 스레드가 아닌 보조 스레드에서 발생하므로 UI 요소와 같은 기본 스레드의 일부 요소를 수정하려고 하면 스레딩 예외가 발생할 수 있습니다. 기본 Form 또는 Control의 요소를 수정해야 하는 경우 를 사용하여 Invoke변경 요청을 다시 게시합니다. 그러면 적절한 스레드에서 작업이 수행됩니다.

이벤트 처리에 대한 자세한 내용은 이벤트 처리 및 발생 을 참조하십시오.

적용 대상