Forum: PC-Programmierung Echtzeit VB.net RS232 Empfang wird träge


von Jens (Gast)


Lesenswert?

Hallo,
ich hoffe von euch hat jemand eine Idee. Ich bekomme von einem 
Mikrocontroller einen Datenstrom mit 9600 Baud. Diesenwollte ich in 
einem Fenster unter VB .net darstellen. Soweit funktioniert das ganze 
auch ganz gut. Jedoch tritt nach einigen Minuten Laufzeit ein zeitlicher 
Versatz zwischen den Messwerten auf Controllerseite und den Angezeigten 
unter Windows auf.

Das ganze funktioniert nach einem Tutorial das ich im Netz gefunden 
hatte:
1
    ' Wird bei Empfang eines UART Bytes ausgeloest
2
    Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
3
        Wert = SerialPort1.ReadByte() ' Wert aus UART Puffer einlesen
4
        Me.Invoke(TextboxAktualisieren) ' Wert an Fensterprozess uebergeben
5
    End Sub

Ich vermute das das mit dem Prozessmanagment unter Windows zu tun hat. 
Jedoch weiß ich nicht wie man Windows dazu zwingt öfter in den 
Empfangspuffer zu gucken.

Hat jemand einen Tipp?
Danke schonmal.

von tastendrücker (Gast)


Lesenswert?

>Jedoch weiß ich nicht wie man Windows dazu zwingt öfter in den
>Empfangspuffer zu gucken.

Na, SerialPort1_DataReceived wird schon schnell genug nach Empfang eines 
Bytes aufgerufen. Ich schätze mal, dass das Problem bei dem 
'TextboxAktualisieren' liegt, dass mit zunehmendem Inhalt immer länger 
dauert.

von Philipp B. (philipp_burch)


Lesenswert?

Stell doch mal ReceivedBytesThreshold etwas höher und lies im 
DataReceived-Event alle verfügbaren Daten aus. Eine TextBox zeichenweise 
zu aktualisieren ist nicht so toll. Dann vielleicht noch einen 
StringBuilder als Puffer verwenden und zyklisch (z.B. mit einem Timer 3 
Mal pro Sekunde oder so) in die TextBox kopieren.

von Matthias (Gast)


Lesenswert?

Servus.

Ich hab sowas in der Art schon in C#2005 pogrammiert, aber bei mir wars 
nur ein kurzer Datenstrom, der abzufangen war für die Auswertung.

private void Daten_Empfang_SeriellerPort(object sender, 
SerialDataReceivedEventArgs e)

{
            //--Zwischenspeichern der Daten in String-Variable
            Zwischenspeicher = Zwischenspeicher + 
SeriellerPort.ReadExisting();

}


So hab ich nach der festgelegten Zeit (Timer in C#) die Daten im 
Zwischenspeicher abgeholt soweit ich mich erinnere. Ist ja jetzt schon 
fast 2 Jahre her das ganze. Bei Bedarf kann ich dir mal die Klasse 
zukommen lassen, musst halt nochmal nachvollziehen...dokumentiert ist 
sie einigermassen, aber halt noch aus meinen Anfangszeiten.

Aber ich vermute auch das die "Me.Invoke(TextboxAktualisieren)" zu 
langsam ist. Aufbau der Ganzen Optik dauert doch etwas länger. So kannst 
passieren das du aufeinmal zwischendrin was verpasst oder einfach 
mittendrin wieder ins "SerialPort1_DataReceived" rutscht.
Werd selber auch bald vor so einem Problem stehen...
Ich hab mir überlegt die Daten vom Programm aus immer abzuhohlen wenn 
die Aktualisierungen durchgezogen sind. Vll auch eine Idee für dich.

MfG
Matthias

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.