Probleme mit WaitCommEvent
-
Hallo.
Ich bin rechter Neuling in Visual C++ und hoffe mal, dass ich trotzdem hier richtig bin. Sollte das ganze aber unter MFC einzuordnen sein (was durchaus sein kann... wo ist da eigentlich die Grenze?) bitte ich einen Mod das dorthin zu verschieben, Danke.
Zum eigentlichen Problem:
Ich steuere ein Gerät an, welches am Serialport des PCs angeschlossen wird. Die funktionsweise ist denkbar einfach: irgendeinen Charakter hinsenden (als wake-up/Initialisierung) und das Gerät sendet ein Ready-Signal (ein "<"). Ab sofort kann man bestimmte Befehle (z.B. "D") senden, erhält danach die Resultate und hinterher wieder ein Ready-Signal. Das Gerät kann nur dann eine Messung durchführen, wenn es vorher ein Ready-Signal gesendet hat.
Das Ziel ist es, so schnell wie möglich zu messen. D.h. das Programm muss nicht nur Messbefehle senden, sondern auf den Serialport reagieren. Schon alleine deshalb, weil die tatsächliche Messdauer nicht bestimmbar ist.
Nach einigem hin und her habe ich "WaitCommEvent" gefunden und das ganze darüber gelöst. Soweit funktioniert das auch sehr gut.Das Problem ist das Gerät selbst: Ab und an "veschluckt" es sich. Es reagiert plötzlich nicht mehr. Das kann man wieder hinkriegen, indem man den Befehl nochmal sendet.
Das Problem ist nur, wenn es sich verschluckt, bleibt auch das Programm hängen, da es einen WaitCommEvent-Befehl ausführt und auf ein Event wartet welches niemals stattfindet, weil eigentlich erst das Programm etwas senden müsste.Ein erster spontaner Gedanke wäre ein Timer, da es ein Maximum an Wartezeit gibt (durch Test ermittelt) die so eine Messung dauern könnte. Da Dauermessungen über mehrere Stunden angestrebt sind, verliere ich lieber 1-2 Messwerte, aber dafür läuft das Programm durch, anstatt dass ich viel mehr Messwerte verliere, weil gerade keiner kontrollieren und das Programm neu starten kann.
Nun hat WaitCommEvent viele tolle Optionen, aber die naheliegenste, ein Timeout für den Wait, kennt die Funktion nicht.
Ich dachte da an sowas wie "If WaitCommEvent(blablub) oder (Timer läuft in Timeout)".Ich habe einiges zum Thema Timer gefunden... Schlagworte wie SetTimer, Killtimer, OnTimer usw. aber irgendwie werde ich nicht schlau aus dem ganzen Zeug. Gibts keine einfache Funktion, die mal eben 3500 ms hochzählt und die man abfragen kann?
Vielen Dank im voraus
Thorsten
-
Falsches Forum: Winapi wäre korrekt.
Hoffentlich wird dein Beitrag verschoben.
-
ja theta hat Recht. WinAPI wäre das richtige Forum gewesen.
Wenn Du WaitCommEvent mit Timeout versehen willst, so bietet es sich an, auf Overlapping IO umzustellen. Das musst Du beim CreateFile-Aufruf mit angeben (FILE_FLAG_OVERLAPPED). Das hat den Effekt, dass der WaitCommEvent sofort zurückkommt und man anschließend auf das Event in der OVERLAPPED-Struktur gezielt mit WaitForSingle/oder/MultipleObjects drauf warten kann. Und dort kann man dann einen Timeout angeben oder explicit einen eigenen Timer aufziehen (z.B. WaitableTimer), der den WaitFor*-Aufruf dann wieder weckt.
Eine Implementierung für SerialPort findest Du hier.
Gruß
Werner
-
Das mit dem falschen Unterboard tut mir leid... wenn man bedenkt, dass ich ursprünglich die Aufgabe hatte, das in C++ zu schreiben... Ich kann ja schon programmieren unter C++... dachte ich. Zumindest hat es ein lehRer mal versucht mir Während meiner Ausbildung beizubringen und da liefs auch ganz gut, aber das war mit einem Borland-Compiler und kleinere Befehlszeilen-Dinger.
Nun stelle ich fest dass ich Visual C++, MFC und die WinAPI benutze... und ich immer noch nicht so recht weiß wo das eine anfängt und das andere aufhört.Naja, ich werde mich gleich mal daran machen die Tipps anzuwenden. Ich hoffe mal, dass das nächste Posting von mir ist: Danke. Super. Funzt jetzt.