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追加SerialDataReceivedEventHandlerして、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 、内部入力バッファー内のバイト数と プロパティの値 ReceivedBytesThreshold に関係なく、Eof 文字を受信した場合にも発生します。

PinChangedDataReceived、および ErrorReceived イベントは順に呼び出される可能性があり、基になるストリームがエラーを報告してからイベント ハンドラーが実行されるまでに若干の遅延が発生する可能性があります。 一度に実行できるイベント ハンドラーは 1 つだけです。

イベントは DataReceived 、受信したすべてのバイトに対して発生するとは限りません。 プロパティを BytesToRead 使用して、バッファー内で読み取るデータの残りの量を確認します。

DataReceivedオブジェクトからデータを受信すると、セカンダリ スレッドでイベントがSerialPort発生します。 このイベントは、メイン スレッドではなくセカンダリ スレッドで発生するため、UI 要素など、メイン スレッド内の一部の要素を変更しようとすると、スレッド例外が発生する可能性があります。 メイン Form または Controlの要素を変更する必要がある場合は、 を使用してInvoke変更要求をポストバックします。これにより、適切なスレッドで処理が行われます。

イベントの処理の詳細については、「処理とイベントの発生」を参照してください。

適用対象