SerialPort.DataReceived 事件
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
表示已從 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 物件接收資料時,會在次要執行緒上引發事件。 因為這個事件是在次要執行緒上引發,而不是主執行緒,所以嘗試修改主執行緒中的某些元素,例如 UI 元素,可能會引發執行緒例外狀況。 如果需要修改主要 Form 或 Control 中的專案,請使用 將變更要求張貼回 Invoke ,這會在適當的執行緒上執行工作。
如需處理事件的詳細資訊,請參閱 處理和引發事件。
適用於
意見反應
https://aka.ms/ContentUserFeedback。
即將推出:在 2024 年,我們將隨著內容的意見反應機制逐步淘汰 GitHub 問題,並以新的意見反應系統來取代。 如需詳細資訊,請參閱提交並檢視相關的意見反應