Timingproblem mit Serialport- und Timer Object

12/04/2009 - 16:08 von Markus Barkholz | Report spam
Hallo News-Gemiende,

ich habe ein Problem mit meinem Tool, das ein GPS-Dongle von Navilock
auswerten soll. VB(2005) Express
Nach Öffnen des ComPorts werden bei 4800bps die GPS-Daten empfangen
über einige Funktionen zur Stringaufbereitung Grafisch über zwei
Pictureboxen als Analoguhr und Analogkompass dargestellt. Habe das Tool
nun über Nacht laufen lassen und mußte feststellen, dass die Anzeige der
Uhr gut eine Stunde nach ging. Offenbar scheint der Empfangspuffer des
Serialport-Objects mit Daten so voll zu stecken das es nicht mehr die
aktuellen Daten anzeigt. Habe nun mit dem Serialport-Object rumgespielt
und auch die Timer-Einstellungen veràndert aber ohne Erfolg. Bei der
Timer-Zeit habe ich dann 100millisekunden verucht - dann reagiert das
Tool aber nicht mehr auf Eingaben und schmiert ab. Ein weiterer Versuch
war den Empfangspuffer auf 128 Bytes herunter zu setzen oder den Puffer
einmal die Minute komplett zu leeren. Letzteres funktioniert zwar, làßt
die Anzeigen dann aber stolpern was nun auch nicht wünschenswert ist.
Bin jetzt ein wenig überfragt. Gibt es da eine saubere Lösung als diese
Brachialmethode?


Gruss, Markus
 

Lesen sie die antworten

#1 Peter Götz
12/04/2009 - 17:36 | Warnen spam
Hallo Markus,

ich habe ein Problem mit meinem Tool, das ein GPS-Dongle
von Navilock auswerten soll. VB(2005) Express
Nach Öffnen des ComPorts werden bei 4800bps die
GPS-Daten empfangen



Wie / wann werden Daten empfangen, bzw. wie
reagierst Du auf ankommende Daten?

über einige Funktionen zur Stringaufbereitung Grafisch
über zwei Pictureboxen als Analoguhr und Analogkompass
dargestellt. Habe das Tool nun über Nacht laufen lassen
und mußte feststellen, dass die Anzeige der Uhr gut eine
Stunde nach ging.



Ohne Deine relevanten Code zu kennen, kann man
dazu nichts sagen.


Offenbar scheint der Empfangspuffer des Serialport-Objects
mit Daten so voll zu stecken das es nicht mehr die aktuellen
Daten anzeigt.



Wenn das SerialPort-Objekt Daten empfàngt, löst es u.a.
das Ereignis _DataReceived in welchem im Parameter e
erkennbar ist, um welche Art von Daten es sich handelt.
Hier kannst Du auf die Ankunft der Daten mit einem der
Befehle SP.Read, .ReadByte, ReadChar, ReadExisting
oder ReadLine reagieren um die Daten aus dem
Empfangspuffer zu lesen.


Habe nun mit dem Serialport-Object rumgespielt und auch
die Timer-Einstellungen veràndert aber ohne Erfolg.



Welche Timer-Einstellungen?
Ich rate mal, Du versuchst das Auslesen des Datenpuffers
über einen Timer zu steuern, der natürlich nicht weiss,
wann wieviele Daten im Datenpuffer angekommen sind.

Bei der Timer-Zeit habe ich dann 100millisekunden
verucht - dann reagiert das Tool aber nicht mehr auf
Eingaben und schmiert ab.



Das timergesteuerte Lesen der Daten ist eher ein
Lotteriespiel. Du solltest besser auf das vom SerialPort
ausgelöste Ereignis _DataReceived reagieren.


Ein weiterer Versuch war den Empfangspuffer auf 128
Bytes herunter zu setzen oder den Puffer einmal die
Minute komplett zu leeren.



Auch das wàre reine Lotterie, da Du nicht wissen kannst
wieviele Daten innerhalb dieser Minute ankommen.

Letzteres funktioniert zwar, làßt die Anzeigen dann aber
stolpern was nun auch nicht wünschenswert ist.
Bin jetzt ein wenig überfragt. Gibt es da eine saubere
Lösung als diese Brachialmethode?



Schau Dir mal das Beispiel unter

www.gssg.de -> Visual Basic -> VB.net
-> Serial Port (RS232) Chat

an. Darin siehst Du u.a. wie Du auf ankommende
Daten im Ereignis _DataReceived reagieren kannst
und so ohne Timer jederzeit ankommende Daten
sofort zu verarbeiten.

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen