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
这将在正确的线程上执行工作。
有关处理事件的详细信息,请参阅
“处理和引发事件
”。