Blockierendes Lesen, synchrone und asynchrone Verbindungen...
Hallo,
nachdem ich jetzt tagelang im Internet nach einer Lösung gesucht habe und mir erfolglos den Kopf zerbrochen habe, hoffe ich dass Ihr mir weiterhelfen könnt:
Folgende Problemstellung: Ich möchte ein serielles Gerät ansteuern, das in etwa wie ein Modem anzusprechen ist: Es gibt Befehle um diverse Parameter einzustellen/abzufragen und einen Datenmodus, in dem Daten gesendet und empfangen werden.
Nun ist es so, dass ich in erster Instanz prüfen möchte, ob ein Gerät an der seriellen Schnittstelle angeschlossen ist, dazu sende ich einen Befehl zur Versionsabfrage und warte auf eine Antwort. Da tritt das erste Problem auf - ich muss also eine Antwort senden, eine gewisse Zeit (Timeout ca. 2 Sekunden) warten, ob was zurückkommt und gebe dann die Information über den gefundenen oder nicht gefundenen Adapter aus.
Problem: Während der zwei Sekunden soll das Programm natürlich nicht hängen bleiben, aber der Lesezugriff ist ja blockierend und wenn keine Antwort kommt, hängt alles.
Wenn ich einen Thread für die Abfrage erstelle, müsste ich diesen nach dem eingestellten Timeout killen, also bräuchte ich einen weiteren Überwachungsthread, damit mein Programm beim Warten nicht hängenbleibt? Und wie beende ich den Thread sauber, wenn der Zugriff auf die Schnittstelle ja blockiert? stop() sollte ja nicht mehr verwendet werden, aber bleibt mir dann überhaupt was anderes übrig?
Angenommen diese Hürde ist umschifft, wie wird der Rest dann weiter organisiert? Um den Adapter anzusprechen muss ich also erst ein paar Einstellungen vornehmen, also Befehl senden, Antwort abwarten, nächsten Befehl, wieder Antwort abwarten (also synchron) - sobald ich in den Datenmodus gehe, läuft aber alles asynchron... wie bekomme ich das dann am besten hin?
Also kann man das obere Problem mit dem unteren kombinieren oder muss man synchrone/asynchrone Kommunikation trennen? Und wie sollen die Threads am besten erstellt werden, damit die ganze Kommunikation funktioniert? Hat sowas jemand schon mal gemacht, oder gibts da vielleicht andere, viel bessere Lösungsansätze als meiner?
Ich freu mich auch über Stichpunkte oder kurze Hinweise, aber momentan steh ich total auf dem Schlauch ... :-/
Hallo,
nachdem ich jetzt tagelang im Internet nach einer Lösung gesucht habe und mir erfolglos den Kopf zerbrochen habe, hoffe ich dass Ihr mir weiterhelfen könnt:
Folgende Problemstellung: Ich möchte ein serielles Gerät ansteuern, das in etwa wie ein Modem anzusprechen ist: Es gibt Befehle um diverse Parameter einzustellen/abzufragen und einen Datenmodus, in dem Daten gesendet und empfangen werden.
Nun ist es so, dass ich in erster Instanz prüfen möchte, ob ein Gerät an der seriellen Schnittstelle angeschlossen ist, dazu sende ich einen Befehl zur Versionsabfrage und warte auf eine Antwort. Da tritt das erste Problem auf - ich muss also eine Antwort senden, eine gewisse Zeit (Timeout ca. 2 Sekunden) warten, ob was zurückkommt und gebe dann die Information über den gefundenen oder nicht gefundenen Adapter aus.
Problem: Während der zwei Sekunden soll das Programm natürlich nicht hängen bleiben, aber der Lesezugriff ist ja blockierend und wenn keine Antwort kommt, hängt alles.
Wenn ich einen Thread für die Abfrage erstelle, müsste ich diesen nach dem eingestellten Timeout killen, also bräuchte ich einen weiteren Überwachungsthread, damit mein Programm beim Warten nicht hängenbleibt? Und wie beende ich den Thread sauber, wenn der Zugriff auf die Schnittstelle ja blockiert? stop() sollte ja nicht mehr verwendet werden, aber bleibt mir dann überhaupt was anderes übrig?
Angenommen diese Hürde ist umschifft, wie wird der Rest dann weiter organisiert? Um den Adapter anzusprechen muss ich also erst ein paar Einstellungen vornehmen, also Befehl senden, Antwort abwarten, nächsten Befehl, wieder Antwort abwarten (also synchron) - sobald ich in den Datenmodus gehe, läuft aber alles asynchron... wie bekomme ich das dann am besten hin?
Also kann man das obere Problem mit dem unteren kombinieren oder muss man synchrone/asynchrone Kommunikation trennen? Und wie sollen die Threads am besten erstellt werden, damit die ganze Kommunikation funktioniert? Hat sowas jemand schon mal gemacht, oder gibts da vielleicht andere, viel bessere Lösungsansätze als meiner?
Ich freu mich auch über Stichpunkte oder kurze Hinweise, aber momentan steh ich total auf dem Schlauch ... :-/
Zuletzt bearbeitet: