Pollfrei über Netzwerk und serielle Schnittstelle empfangen

Gast #2667650
Lesenswert?

Hallo,

ich würde gerne in einer Windows-Konsolenanwendung gleichzeitig über 
Netzwerk und einer seriellen Schnittstelle Daten empfangen. Das möchte 
ich in c/c++ möglichst ohne Polling hinbekommen.

Für den Netzwerk-Empfang benutze ich normalerweise die 
select()-Funktion. Mit dieser kann ich blockierend auf Empfang von einem 
socket warten. Ich würde gerne der select()-Funktion mit FD_SET auch 
noch einen zusaetzlichen Descriptor fuer die serielle Schnittstelle 
übergeben. Dann würde meine select-Funktion Netzwerk- und seriellen 
Empfang gleichzeitig erkennen können. Geht aber unter Windows nicht, 
weil ich keinen File-Descriptor fuer die serielle Schnittstelle habe, 
denn die Schnittstelle wird mit CreateFile() geoeffnet und da gibts 
einen anderen Handler, der nicht kompatibel mit select ist (oder kann 
man da was konvertieren?).

Im Moment mache ich es so, dass die select-Funktion mit einem 
Sekunden-Timeout aufgerufen wird. Gibt es keinen Netzwerk-Empfang, kehrt 
die select-Funktion nach 1 Sekunde zurück und dann wird auf seriellen 
Empfang gepollt. Das finde ich nicht sehr schick :-)

Kann man über Netzwerk und serielle Schnittstelle gleichzeitig 
"pollfrei" empfangen ?

Vielen Dank fuer Tipps
recently
Gast #2667818
Lesenswert?

@peter II: habe mich jetzt eine Weile mit der genannten Funktion 
WSAWaitForMultipleEvents beschäftigt, jedoch nichts gefunden, wie man 
den HANDLE zum Einsatz bringt, der von CreateFile beim Oeffnen eines 
serielles Ports erzeugt wird. Ich befuerchte, die WSA hat nichts mit 
serieller Kommunikation am Hut ?

@googoo: Callback hört sich ja gut an, aber wie und wo kann ich sowas 
einbauen ?
#2667932
Lesenswert?

Hi,

> @peter II: habe mich jetzt eine Weile mit der genannten Funktion
> WSAWaitForMultipleEvents beschäftigt, jedoch nichts gefunden, wie man
> den HANDLE zum Einsatz bringt, der von CreateFile beim Oeffnen eines
> serielles Ports erzeugt wird. Ich befuerchte, die WSA hat nichts mit
> serieller Kommunikation am Hut ?
>

So wie ich das lese kann WSAWaitForMultipleEvents Events aus 
verschiedenen Quellen annehmen, da es intern auch nur 
WaitForMultipleObjects aufruft. Du musst den COM-Port nur asynchron mit 
einer OVERLAPPED-Struktur in CreateFile anlegen (unbedingt im MSDN 
nachlsesen, es gibt da einiges zu beachten). In der OVERLAPPED-Struktur 
steht dann auch Dein Event für die serielle Kommunikation drin und den 
übergibst Du dann mit an lphEvents (Array der Events).

Gruß,

Oliver

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren