# RXTX und close



## boesi (7. Aug 2007)

Moin

Ich will auf die serielle Schnittstelle zugreifen und verwende dazu RXTX. Funktioniert soweit auch ganz gut, aber ...

... nur das Schliessen des Ports mit close() dauert mal locker 20s, wenn's überhaupt funktioniert. Einen EventListener hab ich schon an den Port gehängt, wie hier beschrieben. Das hat aber nichts gebracht.

Mit dem Debugger [ich verwende Eclipse] hab ich festgestellt, das es wohl an der Methode getPortIdentifier hängt, die von close aufgerufen wird. Wenn ich in der main-Methode CommPortIdentifier.getPortIdentifier("COM2") [am COM2 hängt das Gerät] aufrufe, braucht der Aufruf glatte 200s [ja zweihundert]. Dafür geht das folgende close dann in 0s. Wenn ich zuerst CommPortIdentifier.getPortIdentifiers() aufrufe, dauert das ebenfalls um die 200s, ein folgendes CommPortIdentifier.getPortIdentifier("COM2") geht dann wieder in 0s.

Mit dem Debugger  sehe ich, dass das Program eine halbe Ewigkeit braucht um nur in die Methode reinzugehen. In der Methode passiert dann zwar ne ganze Menge, scheinbar aber ohne weitere Verzögerung [soweit man da dem Debugger trauen kann]. Ganz so als wüsste Java nicht wo der Code liegt und erstmal suchen muss ... Ausserhalb der IDE dauert das ganze aber genauso lang. Ansonsten hab ich die Bibliothek ganz normal über Project->Properties->Java Build Path->Libraries eingebunden.


Nochmal meine eigentliche Frage: Wie kann ich CommPortIdentifier.getPortIdentifiers() dazu bewegen ohne Verzögerung zu starten?


cu boesi

PS: Eigentlich wollte ich die Frage ja auf der Mailingliste von RXTX stellen, aber die [oder den Server] scheint's nicht mehr zu geben. Weiss da jemand mehr?


----------



## boesi (7. Aug 2007)

Noch ein paar Infos über mein System die ich glatt vergessen hab:

OS: Windows XP SP2
IDE: Eclipse 3.3.0
Java 1.6.02 (JDK und JRE)
An COM-Ports gibt's [die von CommPort.getPortIdentifiers() auch alle erkannt werden]:

COM1 - da hängt ein altes Graphik-Tablett dran
COM2 - über USB-Adapter, da hängt das zu steuernde Gerät
mein Bluetooth-Adapter ist der Meinung 11 COM-Ports besetzen zu müssen: COM9-COM19
CommPort.getPortIdentifiers() liefert noch LPT1, da hängt ein Drucker dran

So ich hoffe damit kann irgendjemand was anfangen


cu boesi


----------



## boesi (10. Aug 2007)

hmm keiner hat ne Lösung oder wenigstens einen Kommentar? Schade ...

Ok frag ich mal anders rum: Nutzt jemand die serielle Schnittstelle mit Java unter Windows ohne das beschriebene Problem? 


Auf jeden Fall trotzdem mal Danke für eure Hilfe :roll:
cu boesi


----------



## HoaX (11. Aug 2007)

ja, geht einwandfrei, unter windows und linux


----------



## boesi (11. Aug 2007)

HoaX hat gesagt.:
			
		

> ja, geht einwandfrei, unter windows und linux


Hmm kannst du auch ein paar Infos geben? 
zB: 
welche Version von Java, RXTX oder javax.comm
USB-Adapter oder direkt angeschlossen?
Wie liest du die Daten aus? Über SerialPortEvent, in einem separatem Thread oder ganz anders?
Weil Google liefert auch nur die beiden Ergebnisse Geht/Geht nicht - ist nur bedingt hilfreich  :x


cu boesi


----------



## boesi (11. Aug 2007)

Wo ich grad so frustriert bin - wollte ich doch einfach mal javax.comm ausprobieren ...

... und muss feststellen, dass das bei meiner Java-Installation gar nicht dabei ist, obwohl im User Guid bei Sun steht "...Java(tm) communications API, which is a standard extension to the Java platform".  ???:L 

Aber dann doch: "Implementations of the API are currently available for Solaris SPARC, Solaris x86, and Linux x86."  :autsch:


cu boesi


----------



## peter1235 (15. Aug 2007)

Hi boesi,

ich probiere auch gerade mit dem rxtx. Da der Server qbang, auf dem wohl das wiki liegt, nicht erreichbar ist, frage ich mich, wo es Dokumentation zu der rxtx-Bibliothek gibt. Kannst Du mir da jemand weiterhelfen?

Wenn ich es dann bei mir ausprobiere kommt für Dich ja hoffentlich auch noch eine Antwort auf  Deine Frage...

Gruß
Thomas


----------



## peter1235 (15. Aug 2007)

Hi boesi, hi an alle,

wie kann ich denn feststellen, ob der Port überhaupt erfolgreich geöffnet wurde?

Weitere Frage: Wie kann ich Daten über den Port einlesen? Muss ich dafür den InputStream vom Reader holen?

Danke und Gruß


----------



## boesi (15. Aug 2007)

peter1235 hat gesagt.:
			
		

> wie kann ich denn feststellen, ob der Port überhaupt erfolgreich geöffnet wurde?


Wenn du kein Hardware-Handshake verwendest, nur indem du Daten von dem Port liest. Ich geh davon aus, dass, wenn keine Exception kommt, der Port offen ist.

```
try {
	rsConn = new RXTXPort(Konst.comPort);
	rsConn.setSerialPortParams(Konst.comBaud, Konst.comData, Konst.comStop, Konst.comParity);
	rsInput = rsConn.getInputStream();
	return true;
} catch (PortInUseException exc) {
	System.out.println("Öffnen des RS232 Ports: " + exc.getMessage());
	exc.printStackTrace();
} catch (UnsupportedCommOperationException exc) {
	System.out.println("Setzen der RS232-Parameter" + exc.getMessage());
	exc.printStackTrace();
}
```



			
				peter1235 hat gesagt.:
			
		

> Weitere Frage: Wie kann ich Daten über den Port einlesen? Muss ich dafür den InputStream vom Reader holen?


Ja. In meinem Fall sendet das Gerät einen kontinuierlichen Datenstrom, wobei es egal ist, wenn ein paar Bytes verloren gehen. Daher lese ich die Daten in einem Thread (und nicht über einen SerialPortEventListener):

```
public void run() {
	while (running) {
		try {
			// warten auf den Beginn der Zeile
			// Zeile beginnt mit 'A'
			while (rsInput.read() != 65) {
				this.sleep(1);
			}
			ind = 0;
			while (true) {
				// jetzt kommen die interessanten 50 Bytes
				recvChars[ind++] = (char) rsInput.read();
				this.sleep(1);						
				if (ind >= 50) {
					dataChanged(recvChars.clone(), KeyObserver.all);
					break;
				}
			}
		} catch (IOException exc) {
			// rsInput ist weg, also sollen wir uns wohl beenden
			exc.printStackTrace();
			break;
		} catch (InterruptedException exc) {
			// TODO Auto-generated catch block
			exc.printStackTrace();
			break;
		}
	}
	this.isStopped = true;
}
```
Die empfangenen Daten verteil ich dann über das "Observer pattern". 


cu boesi


PS: mein Problem mit close und getPortIdentifiers ist aber trotzdem nicht gelöst.


----------



## peter1235 (16. Aug 2007)

Danke für Deine Hilfe boesi. Das bringt mich schon mal weiter.



			
				boesi hat gesagt.:
			
		

> PS: mein Problem mit close und getPortIdentifiers ist aber trotzdem nicht gelöst.



Bei mir beendet sich das Programm bisher ganz regulär und der port wird also relativ schnell geschlossen. Daher kann ich Dir wohl auch nicht weiterhelfen bei diesem konkreten Problem.

cu


----------



## boesi (17. Aug 2007)

peter1235 hat gesagt.:
			
		

> Bei mir beendet sich das Programm bisher ganz regulär und der port wird also relativ schnell geschlossen. Daher kann ich Dir wohl auch nicht weiterhelfen bei diesem konkreten Problem.


Das tritt bei mir auch nicht immer auf, aber zu etwa 95%. Wenn ich das Programm nicht über Eclipse starte, scheint das Problem nicht ganz so häufig aufzutreten, ist aber trotzdem vorhanden.

Interessanterweise ist die Wartezeit immer ein Vielfaches von 20s - die Zeiten 20, 200, 220, 40s sind mir bisher mit abnehmender Häufigkeit begegnet.

Etwas merkwürdig ist auch, dass ich das Programm abschiessen kann und der Port dann nicht blockiert ist - das kenn ich von frühern Projekten (kein Java) eigentlich anders.


cu boesi


----------



## peter1235 (17. Aug 2007)

boesi hat gesagt.:
			
		

> Interessanterweise ist die Wartezeit immer ein Vielfaches von 20s - die Zeiten 20, 200, 220, 40s sind mir bisher mit abnehmender Häufigkeit begegnet.


Das ist natürlich komisch. Klingt nach einer systematischen Verzögerung. Ist doch schon mal ganz gut, vielleicht findet man doch noch einen "normalen" Grund.



			
				boesi hat gesagt.:
			
		

> Etwas merkwürdig ist auch, dass ich das Programm abschiessen kann und der Port dann nicht blockiert ist - das kenn ich von frühern Projekten (kein Java) eigentlich anders.
> cu boesi



Dann wird der Port von Deinem Programm noch regulär geschlossen. Wann genau schießt Du das Programm denn ab? Gegen Ende während der langen Wartepause?

cu


----------



## boesi (18. Aug 2007)

peter1235 hat gesagt.:
			
		

> Das ist natürlich komisch. Klingt nach einer systematischen Verzögerung. Ist doch schon mal ganz gut, vielleicht findet man doch noch einen "normalen" Grund.


Grad ist noch die Zeit von 160s dazu gekommen.


			
				peter1235 hat gesagt.:
			
		

> Dann wird der Port von Deinem Programm noch regulär geschlossen. Wann genau schießt Du das Programm denn ab? Gegen Ende während der langen Wartepause?


Immer dann, wenn ich keine Lust hab, auf das reguläre Ende des Programm zu warten, weil ich das Programm gleich wieder starten will. Und der Port war bis jetzt nicht ein einziges Mal blockiert.

Ich steh kurz davor, einfach ein Fenster mit dem Text "Programm wird geschlossen" einzubauen ... [*]


cu boesi


[*] Das ist ja wohl so ziemlich das dämlichste was man machen kann ...


----------

