# Serielle Schnittstelle Probleme bei Datenauswertung



## Stefan Tschiggerl (31. Mai 2008)

Hallo,

ich habe für eine Datenauswertung über die serielle Schnittstelle ein Java-Programm geschrieben und mein Problem bereits in folgendem Forum erläutert:
http://www.mikrocontroller.net/topic/101413

Ich hoffe, dass sich in diesem Forum einige finden, die mir bei meinem Problem helfen können.


Weiters habe ich zur Auswahl des COM-Ports einen Dialog erstellt, in dem in einer JComboBox alle verfügbaren COM-Ports angezeigt werden. Die ComboBox erzeuge ich folgendermaßen: (Klasse SerialInterface ist im Anhand zu finden)
JComboBox cbSchnittstellen = new JComboBox(SerialInterface.getAllInterfaces());

An meinem Notebook verwende ich einen USB-RS232 Wandler, da ich keine serielle Schnittstelle habe. Stecke ich den Wandler vor dem Programmstart an, wird der COM-Port des Wandler aufgelistet, stecke ich ihn erst zur Laufzeit an, erscheint er nie in der ComboBox. Kann mir bitte jemand sagen, wie ich die verfügbaren COM-Ports aktualisieren kann?

Danke für euere Antworten
mfg Stefan


----------



## zeja (31. Mai 2008)

Hmm versuch doch mal am CommPortIdentifier einen CommPortOwnershipListener anzumelden und schau ob der informiert wird wenn du den Adapter im laufenden Betrieb ransteckst. Dann könntest du daraufhin die Combobox aktualisieren.


----------



## Stefan Tschiggerl (31. Mai 2008)

Ok das habe ich versucht, jedoch wird die Methode ownershipChange(int type) dieses Interfaces nur aufgerufen, wenn ich den Com-Port öffne und wenn er geschlossen wird, aber nicht wenn der Adapter abgesteckt wird.

Vielleicht habe ich mich falsch ausgedrückt, es geht nicht darum wann ich die ComboBox aktualisieren muss, sondern dass beim Aufruf des Dialoges nur die Schnittstellen angezeigt werden, die zur Zeit des Programmstarts gefunden wurden. Egal wie oft ich den Dialog neu erstelle und anzeige, es werden immer nur dieselben Schnittstellen aufgelistet.

Liegt das möglicherweise an folgendem?
Im Interface CommDriver gibt es folgende Methode:
public abstract void initialize()

initialize() will be called by the CommPortIdentifier's static initializer. The responsibility of this method is: 1) Ensure that that the hardware is present. 2) Load any required native libraries. 3) Register the port names with the CommPortIdentifier.

Ich habe leider nicht rausgefunden, ob CommPortIdentifier dieses Interface implementiert, jedoch wenn das so ist, bedeutet das, dass diese Methode nur 1 mal aufgerufen wird?

Hast du evtl. auch eine Ahnung wie ich das Problem aus dem anderen Forumsbeitrag lösen könnte?

mfg Stefan


----------



## zeja (31. Mai 2008)

Ich finde es zwar sehr unhöflich Fragen gleichzeitig in zwei Foren zu stellen aber nun gut..

Was meinst du denn damit dass es in der write-Methode einfach hängen bleibt? Und was für eine Implementierung von javax.comm verwendest du?


----------



## Stefan Tschiggerl (31. Mai 2008)

Ich verwende derzeit javax.comm 2.0.

Ich meine damit, dass in der Methode write() in SerialInterface bw.write() zwar ausgeführt wird, das Programm aber bei bw.flush() nicht weiter fortsetzt (Endlosschleife)

mfg Stefan


----------



## zeja (31. Mai 2008)

Also der Aufruf von bw.flush kehrt nicht zurück oder was meinst du?


----------



## Stefan Tschiggerl (1. Juni 2008)

Genau, das ist das Problem.


----------



## zeja (1. Juni 2008)

Ich kann leider nur raten, da ich es ja selbst nicht ausprobieren kann..

Hast du mal am SerialPort die addEventListener zusammen mit den notify-Methoden probiert. Vielleicht bekommst du darüber eine Info...

In jedem Fall solltest du in den catch-Blöcken mal ein e.printStackTrace einfügen, sonst wirst du nie wissen was du Ursache für eine Exception war.

Probier mal ein wenig rum mit all den Methoden die dir zur Verfügung stehen. Oder schau mal in den Sourcecode... mach nen Debugger an usw.

Du könntest dir auch mal RXTX anschauen, vielleicht ist dass da besser gelöst.


----------



## Stefan Tschiggerl (1. Juni 2008)

Danke für deine Tipps, ich werde diese auch so bald wie möglich anwenden, habe derzeit aber wenig Zeit.

Sobald ich dann neue Informationen und Erkenntnisse habe werde ich mich wieder melden.

mfg Stefan


----------



## Stefan Tschiggerl (3. Juni 2008)

Hallo,

ich hab die RXTX getestet und es geht nun beinahe alles!
Also die Schnittstellen im Dialog werden aktualisiert wenn ich zur Laufzeit den USB-Wandler anstecke und dann den Dialog neu aufrufe...

Weiters funktonierts nun auch wenn ich COM4/5 auswähle was vorher ja zu einem Problem geführt hat, da Programm bei bw.flush() nicht mehr zurückgekommen ist

Ich habe gelesen, dass die JavaComm für Windows nicht mehr weiterentwickelt wird/wurde und somit gab es evtl einige Fehler. Mit der RXTX funktionierts also ganz gut.

Bleibt nur noch ein Problem: Wenn ich den USB-Wandler abstecke während der COM Port geöffnet ist, kommt zwar eine IOException und das Programm hängt sich nicht auf wie bei der JavaComm, aber wie kann ich abfragen woher die IOException gekommen ist?

Es gibt nämlich 2 Möglichkeiten: Entweder Wandler abgesteckt oder zb kein RS232-Gerät angesteckt (BufferedReader wirft dann IOException)
Wenn der Wandler abgesteckt wurde möchte ich gerne erkennen, dass die IOException dadurch ausgelöst wurde, daraufhin schließe ich den COM-Port und warte nun bis dieser COM-Port wieder verfügbar ist indem ich diesen einfach immer wieder zu öffnen versuche. Das ist nötig weil bei neuerlichem Anstecken des Wandlers kommt trotzdem weiterhin die IOException (also das Programm liest nicht einfach wieder Daten ein) und es wäre toll wenn ich das schaffen könnte dass die Auswertung fortsetzt sobald der COM Port wieder verfügbar ist.

Kann ich das einfach wenn ich eine IOException e auffange mit if(e.getMessage().equals("exception von Wandlerabstecken...")) -> mach was oder geht das einfacher?

Sobald der Wandler abgesteckt wurde kommt ständig die Ausgabe in der Konsole (keine Exception): Error 0x5 at /home/bob/foo/rxtx-devel/build/../src/termios.c(482): Zugriff verweigert
Und nach einigen Sekunden dann eine IO Exception: Input/output error in writeArray
Das Ganze wiederholt sicher ständig bis das Programm oder der Thread beendet wird 

Danke nochmals für den Tipp mit RXTX und ich hoffe du kannst mir hier nochmal helfen wie ich das sinnvoll lösen kann

mfg Stefan


----------

