www.mikrocontroller.net

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


Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
    ' Wird bei Empfang eines UART Bytes ausgeloest
    Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
        Wert = SerialPort1.ReadByte() ' Wert aus UART Puffer einlesen
        Me.Invoke(TextboxAktualisieren) ' Wert an Fensterprozess uebergeben
    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.

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.