Forum: PC-Programmierung Windows RS232 Blocked Reading C++


von Matze (Gast)


Lesenswert?

Hey Forumler,
ich habe ein mehr oder weniger kleines Problem:
es geht wie der Titel vermuten lässt um die geliebte RS232 und 
Windows....
Unter Linux tut bereits alles wies soll.

Also es geht um folgendes:
In einem extra thread soll immer im hintergund die Daten gelesen werden.
Szenario 1:
Ich öffne die Schnittstelle mittels CreateFile ohne dabei Flags zu 
setzen.
in besagtem thread nutze ich nun ReadFile zum auslesen. Der dadurch wird 
der Thread wie gewünscht so lange blockiert, bis die angegebene anzahl 
Bytes empfangen wurde oder der eingestellte Timeout kommt.
Das problem ist jetzt, dass ein zweiter Thread so wies aussieht nicht 
schreiben kann (WriteFile) solange der erste sich in ReadFile befindet. 
(der Write wird so lange ebenfals blockert) Und das ist natürlich doof 
schließlich will ich ja meine daten sofort rausjagen.
Auf der Suche nach einer Lösung bin ich auf folgendes gestoßen
Szenario 2:
ich öffne mit dem FILE_FLAG_OVERLAPPED
und nun beginnen die unklarheiten. Es fängt damit an, dass der Thread 
nicht mehr blockiert wird. Er soll aber blockiert werden, schließlich 
soll ja nicht unnötig die CPU belastet werden.

Aus dem ganzen gedönz was in der MSDN dazu steht bin ich leider noch 
nicht so schlau geworden.
gerade spiele ich mit der Methode ReadFileEx rum, und übergeb der eine 
calback methode - die wird allerdings nie aufgerufen und blocken tut 
auch nix.
Dank
hat mir jemand ne lösung?

besten Dank
Matze

von Peter II (Gast)


Lesenswert?


von Der E. (rogie)


Lesenswert?

Grobes Vorgehen:

- Du erstellt ein Event (CreateEvent) und übergibst das Handle der 
OVERLAPPED Struktur.
- Lege mit WaitCommEvent fest, auf was dein thread warten soll,
- Dann wartest du mit WaiforSingleObject auf dieses Event.

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.