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
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.
Geht das nicht über ne CALLBACK Funktion? Winsock kann sowas.
@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 ?
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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.