Moin moin
Ich bräuchte mal fachmännischen Rat.
Problem:
Ich nutze das normale Data_Received Event der seriellen Schnittstelle.
Nun ist es so, dass bei sehr großen/schnellen Datenmengen (max. 512 bytes) im 1ms Bereich das Event einfach zu langsam ist und Verzögerungen von 2-3ms reinhaut.
Baudrate ist 115200, das sollte eigentlich locker ausreichen.
Zudem sind die Daten nur selten mal sehr groß.
Die meiste Zeit sind es ca. 20 Bytes, die in sehr schnellem Takt (~1ms) übertragen werden.
Aber selbst bei höherer Baudrate ist die Verzögerung da und zieht sich über die Dauer wie ein Gummiband (Nachladen).
Mein derzeitger Code sieht ungefähr so aus:
Und ja, ich weiß, dass Readline als schlechter angesehen wird, als wenn ich einzelne Chars auslese aber es ändert nichts an der Timing Situation, das Problem besteht auch, wenn ich einzelne Chars auslese und zusammenfüge.
Nach einiger Recherche hab ich gelesen, dass die BaseStream Methode die bessere Wahl ist, da das Data_Received Event bei hoher bzw. sehr schneller Datenübertragung zu langsam ist.
Leider finde ich bzgl. VB.NET keine brauchbaren Informationen, wie ich das angehe.
Ich finde nur einige kleine Beispiele mit C++ aber zum konvertieren reichen meine Kentnisse nicht aus.
Zum Beispiel hier oder hier.
Und mit Delegates bin ich auch noch ein Anfänger.
Es geht mir nur um das Event, der Rest ist kein Problem.
Soweit ich mal gelesen habe, muss dazu ein Task erstellt werden, damit das Event feuert bzw. anfängt den Port abzuhören?
Wäre super, wenn mir da jemand helfen könnte.
Ich bräuchte mal fachmännischen Rat.
Problem:
Ich nutze das normale Data_Received Event der seriellen Schnittstelle.
Nun ist es so, dass bei sehr großen/schnellen Datenmengen (max. 512 bytes) im 1ms Bereich das Event einfach zu langsam ist und Verzögerungen von 2-3ms reinhaut.
Baudrate ist 115200, das sollte eigentlich locker ausreichen.
Zudem sind die Daten nur selten mal sehr groß.
Die meiste Zeit sind es ca. 20 Bytes, die in sehr schnellem Takt (~1ms) übertragen werden.
Aber selbst bei höherer Baudrate ist die Verzögerung da und zieht sich über die Dauer wie ein Gummiband (Nachladen).
Mein derzeitger Code sieht ungefähr so aus:
VB.NET-Quellcode
- Friend Sub SerialPort_Terminal_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort_Terminal.DataReceived
- Try
- Dim Daten As String = Nothing
- While SerialPort_Terminal.BytesToRead > 0
- If Port_offen = False Then
- If SerialPort_Terminal.IsOpen Then
- SerialPort_Terminal.Close()
- End If
- Else
- Daten = SerialPort_Terminal.ReadLine
- Me.BeginInvoke(Sub() Uebertragen(Zeitstempel() & Daten))
- End if
- End While
- Catch ex As InvalidOperationException
- If Port_offen = True Then
- MessageBox.Show(ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
- End If
- Me.Invoke(Sub() ComPort_verbinden(Button1, ComboBox1, ComboBox2, Button2, False, SerialPort_Terminal)) 'Verbindung trennen
- Catch ex As IO.IOException
- Uebertragen(ex.Message.ToString & Environment.NewLine)
- Catch ex As TimeoutException
- Uebertragen("Fehler Timeout > Baudrate oder gesendeten Befehl überprüfen" & Environment.NewLine)
- Catch ex As Exception
- MessageBox.Show(ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
- End Try
- End Sub
Und ja, ich weiß, dass Readline als schlechter angesehen wird, als wenn ich einzelne Chars auslese aber es ändert nichts an der Timing Situation, das Problem besteht auch, wenn ich einzelne Chars auslese und zusammenfüge.
Nach einiger Recherche hab ich gelesen, dass die BaseStream Methode die bessere Wahl ist, da das Data_Received Event bei hoher bzw. sehr schneller Datenübertragung zu langsam ist.
Leider finde ich bzgl. VB.NET keine brauchbaren Informationen, wie ich das angehe.
Ich finde nur einige kleine Beispiele mit C++ aber zum konvertieren reichen meine Kentnisse nicht aus.
Zum Beispiel hier oder hier.
Und mit Delegates bin ich auch noch ein Anfänger.
Es geht mir nur um das Event, der Rest ist kein Problem.
Soweit ich mal gelesen habe, muss dazu ein Task erstellt werden, damit das Event feuert bzw. anfängt den Port abzuhören?
Wäre super, wenn mir da jemand helfen könnte.
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „IfYesThanNo“ ()