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 项引起的。 由于操作系统确定是否引发此事件,因此可能不会报告所有奇偶校验错误。

如果收到 Eof 字符,则也会引发该 DataReceived 事件,而不考虑内部输入缓冲区中的字节数和属性的值 ReceivedBytesThreshold

PinChanged DataReceived ErrorReceived 事件可能不按顺序调用,并且基础流报告错误时和执行事件处理程序时可能会有轻微的延迟。 一次只能执行一个事件处理程序。

对于收到的每个字节,不保证引发该 DataReceived 事件。 使用属性 BytesToRead 确定缓冲区中要读取的数据量。

SerialPort 对象接收数据时,该 DataReceived 事件在辅助线程上引发。 由于此事件是在辅助线程上引发的,而不是主线程,因此尝试修改主线程中的某些元素(如 UI 元素)可能会引发线程异常。 如果需要修改主 Form 线程中的元素,或者 Control 发布更改请求, Invoke 这将在正确的线程上执行工作。

有关处理事件的详细信息,请参阅 “处理和引发事件 ”。