SerialPort.DataReceived Událost
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Označuje, že data byla přijata přes port reprezentovaný objektem 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
Event Type
Příklady
Tento příklad přidá SerialDataReceivedEventHandler do DataReceived ke čtení všechna dostupná data přijatá na portu COM1. Upozorňujeme, že pro testování tohoto kódu je nutné mít k modelu COM1 připojený hardware, který bude odesílat data.
#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
Poznámky
Události dat mohou být způsobeny libovolnou položkou ve výčtu SerialData . Vzhledem k tomu, že operační systém určuje, jestli se má tato událost vyvolat, nebo ne, ne všechny chyby parity mohou být hlášeny.
Událost DataReceived je vyvolána také při přijetí znaku Eof, bez ohledu na počet bajtů v interní vstupní vyrovnávací paměti a hodnotu ReceivedBytesThreshold vlastnosti.
PinChangedUdálosti , DataReceiveda ErrorReceived mohou být volána mimo pořadí a může dojít k mírnému zpoždění mezi tím, kdy podkladový datový proud hlásí chybu, a spuštěním obslužné rutiny události. Najednou může být spuštěna pouze jedna obslužná rutina události.
Není DataReceived zaručeno vyvolání události pro každý přijatý bajt. BytesToRead Pomocí vlastnosti určete, kolik dat zbývá ke čtení ve vyrovnávací paměti.
Událost DataReceived je vyvolána v sekundárním vlákně při přijetí dat z objektu SerialPort . Vzhledem k tomu, že tato událost je vyvolána v sekundárním vlákně, a nikoli v hlavním vlákně, může pokus o úpravu některých prvků v hlavním vlákně, jako jsou prvky uživatelského rozhraní, vyvolat výjimku z vlákna. Pokud je nutné upravit prvky v hlavní Form nebo Control, odešlete žádosti o změnu zpět pomocí Invoke, který provede práci na správném vlákně.
Další informace o zpracování událostí najdete v tématu Zpracování a vyvolávání událostí.