Ich habe einen SerialDataReceivedEventHandler mit einem formularbasierten Programm in VS2008 Express eingerichtet. Meine serielle Schnittstelle eingerichtet ist, wie folgt:C# .Net Serial DataReceived Ereignisantwort zu langsam für High-Rate-Daten
115200, 8N1
DTR und RTS aktiviert
ReceivedBytesThreshold = 1
Ich habe ein Gerät, mit denen ich in einem BlueTooth bin eine Schnittstelle, USB-Seriell . Hyper Terminal empfängt die Daten bei jeder Datenrate in Ordnung. Die Daten werden regelmäßig in 22 Byte langen Paketen gesendet. Dieses Gerät verfügt über eine einstellbare Rate, mit der Daten gesendet werden. Bei niedrigen Datenraten, 10-20 Hz, funktioniert der folgende Code sehr gut, keine Probleme. Wenn ich jedoch die Datenrate nach 25 Hz erhöhe, fängt es an, mehrere Pakete bei einem Anruf zu empfangen. Was ich damit meine, ist, dass es für jedes eingehende Paket einen Ereignisauslöser geben sollte. Bei höheren Ausgaberaten habe ich die Puffergröße (Befehl BytesToRead) sofort beim Aufruf des Ereignisses getestet und es liegen dann mehrere Pakete im Puffer vor. Ich denke, dass das Ereignis langsam ausgelöst wird und bis es den Code erreicht, haben mehr Pakete den Puffer getroffen. Ein Test, den ich mache, ist, wie oft das Ereignis pro Sekunde ausgelöst wird. Bei 10Hz bekomme ich 10 Event Trigger, super. Bei 100Hz bekomme ich so etwas wie 40 Event Trigger, nicht gut. Mein Ziel für die Datenrate ist 100 Hz ist akzeptabel, 200 Hz bevorzugt und 300 Hz optimal. Dies sollte funktionieren, weil selbst bei 300 Hz, das sind nur 52800 Bit/s, weniger als die Hälfte der eingestellten 115200 Baudrate. Alles, was ich über schaue?
public Form1()
{
InitializeComponent();
serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
}
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
this.Invoke(new EventHandler(Display_Results));
}
private void Display_Results(object s, EventArgs e)
{
serialPort1.Read(IMU, 0, serial_Port1.BytesToRead);
}
Ich habe versucht, den Invoke() - Aufruf zu entfernen und die Daten direkt im DataReceived() - Ereignis mit den gleichen Ergebnissen zu lesen. Tut mir leid, ein wenig naiv zu sein, aber könnten Sie mir mehr darüber erzählen, wie Sie die Warteschlange machen und warum das schneller geht. Danke für die Hilfe. – Matthew