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 свойства .
PinChangedСобытия , DataReceivedи ErrorReceived могут вызываться не по порядку, и может быть небольшая задержка между тем, когда базовый поток сообщает об ошибке, и выполнением обработчика событий. Одновременно может выполняться только один обработчик событий.
Событие DataReceived не гарантируется для каждого полученного байта. Используйте свойство , BytesToRead чтобы определить, сколько данных осталось прочитать в буфере.
Событие DataReceived возникает во вторичном потоке при получении данных из SerialPort объекта . Так как это событие возникает во вторичном потоке, а не в потоке main, попытка изменить некоторые элементы в потоке main, например элементы пользовательского интерфейса, может вызвать исключение потока. Если необходимо изменить элементы в main Form или Control, отправить запросы на изменение обратно с помощью Invoke, который будет выполнять работу в правильном потоке.
Дополнительные сведения об обработке событий см. в разделе Обработка и вызов событий.