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 為何,也會引發 事件。

PinChangedDataReceivedErrorReceived 事件可能會依序呼叫,而且當基礎資料流程報告錯誤和執行事件處理常式時,可能會稍有延遲。 一次只能執行一個事件處理常式。

DataReceived事件不保證會針對每個接收的位元組引發。 BytesToRead使用 屬性來判斷緩衝區中要讀取的資料量。

DataReceivedSerialPort 物件接收資料時,會在次要執行緒上引發事件。 因為這個事件是在次要執行緒上引發,而不是主執行緒,所以嘗試修改主執行緒中的某些元素,例如 UI 元素,可能會引發執行緒例外狀況。 如果需要修改主要 FormControl 中的專案,請使用 將變更要求張貼回 Invoke ,這會在適當的執行緒上執行工作。

如需處理事件的詳細資訊,請參閱 處理和引發事件

適用於