Forum: PC-Programmierung Pollfrei über Netzwerk und serielle Schnittstelle empfangen


von recently (Gast)


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

von Peter II (Gast)


Lesenswert?

recently schrieb:
> Kann man über Netzwerk und serielle Schnittstelle gleichzeitig
> "pollfrei" empfangen ?

http://msdn.microsoft.com/en-us/library/windows/desktop/ms742219%28v=vs.85%29.aspx

könnte sein was du sucht, sonst könnten man das ganze in 2 threads ohne 
polling machen.

von googoo (Gast)


Lesenswert?

Geht das nicht über ne CALLBACK Funktion? Winsock kann sowas.

von recently (Gast)


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 ?

von Peter II (Gast)


Lesenswert?

recently schrieb:
> jedoch nichts gefunden, wie man
> den HANDLE zum Einsatz bringt, der von CreateFile beim Oeffnen eines
> serielles Ports erzeugt wird.

einfach im dem array lphEvents mitübergeben würde ich sagen?

von Oliver R. (superberti)


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

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

Oder die serielle Schnittstelle über einen TCP-Port tunneln (z.B. mit 
com2tcp) Ist zwar nicht gerade die ressourcenschonenste Variant aber 
erledigt dann auch gleich das Problem wenn die serielle Schnittstelle 
mal eine Abteilung weiter an einem PC hängt.

Matthias

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.