SerialPort.DataReceived Zdarzenie
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Wskazuje, że dane zostały odebrane za pośrednictwem portu reprezentowanego SerialPort przez obiekt .
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
Typ zdarzenia
Przykłady
W tym przykładzie dodano element do elementu , SerialDataReceivedEventHandler aby DataReceived odczytać wszystkie dostępne dane odebrane na porcie COM1. Należy pamiętać, że aby przetestować ten kod, konieczne jest posiadanie sprzętu dołączonego do modelu COM1, który będzie wysyłać dane.
#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
Uwagi
Zdarzenia danych mogą być spowodowane przez dowolne elementy w wyliczenie SerialData . Ponieważ system operacyjny określa, czy zgłaszać to zdarzenie, czy nie, mogą być zgłaszane nie wszystkie błędy parzystości.
Zdarzenie DataReceived jest również zgłaszane, jeśli zostanie odebrany znak Eof, niezależnie od liczby bajtów w wewnętrznym buforze wejściowym i wartości ReceivedBytesThreshold właściwości.
PinChangedZdarzenia , DataReceivedi ErrorReceived mogą być wywoływane poza kolejnością i może wystąpić niewielkie opóźnienie między tym, gdy bazowy strumień zgłasza błąd i kiedy jest wykonywana procedura obsługi zdarzeń. Tylko jedna procedura obsługi zdarzeń może być wykonywana jednocześnie.
Nie DataReceived ma gwarancji, że zdarzenie zostanie podniesione dla każdego odebranych bajtów. BytesToRead Użyj właściwości , aby określić ilość danych do odczytania w buforze.
Zdarzenie DataReceived jest wywoływane w wątku pomocniczym, gdy dane są odbierane z SerialPort obiektu. Ponieważ to zdarzenie jest wywoływane w wątku pomocniczym, a nie w wątku głównym, próba zmodyfikowania niektórych elementów w wątku głównym, takich jak elementy interfejsu użytkownika, może zgłosić wyjątek wątkowy. Jeśli konieczne jest zmodyfikowanie elementów w obiekcie głównym Form lub Control, opublikuj żądania zmiany z powrotem przy użyciu polecenia Invoke, co spowoduje wykonanie pracy nad odpowiednim wątkiem.
Aby uzyskać więcej informacji na temat obsługi zdarzeń, zobacz Obsługa i podnoszenie zdarzeń.