Software-Design: Kommunikation mit SerialPort (RXTX)

lyrichter

Mitglied
Hallo liebes Java-Forum!

Zurzeit arbeite ich an einem Programm, das über einen Comm-Port in hoher Frequenz Anfragen an eine Hardware sendet und anschließend die jeweilige Antwort auswertet. Außerdem wird dem User eine GUI angezeigt, die auf gewissen Hardware-Input reagiert.

Meine bisherige Lösung sieht so aus, dass ein erster Thread nach der richtigen Hardware sucht (Ports auflisten, öffnen, init-Nachricht senden, auf vereinbarte Nachricht warten) und den so gefundenen Port sowie Output- und Inputstream in Klassenvariablen speichert. Der Port wird also nicht wieder geschlossen. Außerdem zeigt er durch das Ändern einer Klassenvariable im letzten Aufruf der run()-Methode ggf. die erfolgreiche Kontaktaufnahme mit der Hardware an.
Ein zweiter Thread (javax.swing.Timer) läuft parallel dazu. Ist die o.g. Variable im Ursprungszustand, tut er nichts, wird die Verbindung zur Hardware signalisiert legt er los und sendet in 10ms-Intervallen verschiedene Anfragen an die Hardware und verarbeitet die Antworten mithilfe eines SerialPortEventListeners.

Das ganze Verfahren wurde noch nicht getestet.

Nun habe ich allerdings Bedenken, da der gefundene Port zur Kommunikation einmal geöffnet wird (vom ersten Thread) und danach nie wieder geschlossen. Meiner Meinung nach gibt es zwei problematische Szenarien, zu denen ich jeweils einige Fragen habe:

1) Das Programm wird beendet (Absturz, Benutzer schließt Fenster). Da ja nie ein close()-Befehl aufgerufen wird, ist der Port natürlich noch geöffnet. Hat das negative Folgen?

2) Das Programm läuft und die Hardware wird entfernt oder ausgeschaltet.
Was passiert, wenn die Hardware vom PC getrennt wird? Meldet das Programm sofort etwas oder wird erst eine IOException bei write/read-Operationen auf die Output/Input-Streams geworfen? Oder geschieht nicht einmal das?

In der Anwendung dieser Hardware könnte das zweite Szenrio im Notfall vernachlässigt werden (es zieht einfach niemand den Stecker, wenn das Programm läuft), schön wäre es natürlich trotzdem nicht.
Sollte das bisherige Design (Port einmal öffnen und dann regelmäßig write/read-Operationen ausführen) nicht geeignet sein, was sind dann Alternativen? Ist es sinnvoll, den Port nach jeder write/read-Operation wieder zu schließen und bei Bedarf wieder zu öffnen? Ist das in einem 10-100ms Takt überhaupt möglich?

Wie immer bin ich dankbar für jegliche Anmerkungen und Vorschläge. Schonmal Danke für's Lesen!
Viele Grüße,
lyrichter
 
Zuletzt bearbeitet:
1) Was bei einem Abbsturz passiert weiß ich nicht, aber wenn man die JVM normal beendet, sollte sie alle Port freigeben, egal ob geschlossen oder nicht. (Funktioniert bei Sockets auch)
2) Wenn die Hardware am COM-port entfernt wird kann das deinem Programm wurscht sein, zumindest beim Schreiben(bei USB wäre es afaik anders). Die Informationen werden dann halt ins leere gesendet und du bekommst keine Antwort.

Was das öffnen/schließen angeht: lass es so, es wäre zar möglich, macht bei so kurzen Wartzeiten keinen Sinn.
 
Danke für die schnelle Antwort Kevin94!

1) Was bei einem Abbsturz passiert weiß ich nicht, aber wenn man die JVM normal beendet, sollte sie alle Port freigeben, egal ob geschlossen oder nicht. (Funktioniert bei Sockets auch)


Schön, dann scheint der erste Fall ja kein Problem zu sein.

2) Wenn die Hardware am COM-port entfernt wird kann das deinem Programm wurscht sein, zumindest beim Schreiben(bei USB wäre es afaik anders). Die Informationen werden dann halt ins leere gesendet und du bekommst keine Antwort.

Hmm, die betreffende Hardware wird per USB angeschlossen und simuliert (ist das der richtige Term?) einen Comm-Port. Würde das Probleme bereiten?
Der Lesevorgang wird, so wie ich das sehe, gar nicht erst eintreten, nachdem die Hardware nicht mehr verfügbar ist, da nur der SerialPortEventListener Schreibvorgänge ausführt und der ja nicht mehr aktiv wird. Also spielt der auch keine Rolle.

Es wäre natürlich eigentlich schön, wenn das Programm eine verschwundene Verbindung zur Hardware feststellen und mit einem neuen Verbindungsversuch reagieren könnte...allerdings ist das für dieses Projekt nicht wirklich erforderlich. Wie gesagt, die Bedienung erfolgt nur in einem überschaubaren Umfeld. Wenn es keine schwerwiegende Fehler gibt, ist alles ok.
 

Zurück
Oben