ComPort - Meldung bei emfangenem Zeichen
-
Ich habe ein Terminalprogramm geschrieben.
Über eine Oberfläche können Daten gesendet werden und in einem seperaten Thread wird der ComPort ständig auf ankommende Zeichen untersucht.Das Programm funktioniert korrekt, aber die Prozessorauslastung geht durch die ständige Abfrage auf 100% und der CPU Lüfter nervt in voller Lautstärke.
Man kann zwar fast normal am Rechner arbeiten aber...Gibt es eine Möglichkeit eine Nachricht zu erhalten wenn ein Zeichen empfangen wurde (Interrupt o.ä) sodass sich das Programm im Leerlauf befindet bis etwas eintrifft?
Habe schon was mit WaitCommEvent gelesen, steige da aber nicht durch.Wie wird das bei anderen Terminals gelöst?
Danke schonmal.
P.S.: Habe den Beitrag ebend schon einmal geschrieben finde ihn aber nicht mehr. Sorry falls er nun doppelt erscheint.
-
Verwende doch fertige Klassen und erfinde das Rad nicht immer neu:
http://www.codeproject.com/system/serial.asp
-
Andre2 schrieb:
Habe schon was mit WaitCommEvent gelesen, steige da aber nicht durch.
du hast sicher übersehen vorher mit 'SetCommMask (dein_comm_handle, EV_RXCHAR)' rx events zu aktivieren..
-
Danke für die Tips.
Wie gesagt, durch die WaitCommEvent - Geschichte steige ich nicht so richtig durch.Die CSerial im CodeProject hatte ich schon gefunden. Ist aber sehr mühsam sich das benötigte da rauszusuchen, brauche ja das Drumherum nicht.
Ich habe aber auf dieser Seite trotzdem MEINE Lösung gefunden:
habe im Empfangsthread ein Sleep(1) eingefügt.
Dachte bisher, dass die CPU dann einfach diese Zeit "im Kreis läuft".
In Wirklichkeit nimmt sie aber anscheinend die Zeit für andere Aufgaben.
Meine Prozessorauslastung ist jetzt jedenfalls bei 0% und der Lüfter kreischt nicht mehr.Danke!
-
Sleep(1) machen aber echt nur Frickler...
-
@"....."
Danke für die Blumen.Vorteil:
- geht schnell
- bringt das gewünschte Ergebnis
- ist übersichtlich, einfach, wenig codeNachteil:
- ???
-
Nachteil:
Es ist eben einfach nur polling.
-
Andre2 schrieb:
Wie gesagt, durch die WaitCommEvent - Geschichte steige ich nicht so richtig durch.
ungefähr so geht das
... HANDLE hcomm = CreateFile (... SetCommMask (hcomm, EV_RXCHAR); ... for (;;) { // warte auf ein zeichen DWORD event; WaitCommEvent (hcomm, &event, NULL); // hier z.b. das zeichen mit 'ReadFile' abholen }