RXTX und close

Status
Nicht offen für weitere Antworten.

boesi

Aktives Mitglied
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

Aktives Mitglied
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

Aktives Mitglied
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
 

boesi

Aktives Mitglied
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

Aktives Mitglied
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
 
P

peter1235

Gast
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
 
P

peter1235

Gast
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

Aktives Mitglied
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.
Code:
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):
Code:
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.
 
P

peter1235

Gast
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

Aktives Mitglied
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
 
P

peter1235

Gast
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

Aktives Mitglied
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 ...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M RXTX Details auslesen Allgemeine Java-Themen 6
F rxtx library mit virtuellem Comport Allgemeine Java-Themen 2
T Outputstream write() gets blocked using RXTX to communicate with HC-05 BT Module Allgemeine Java-Themen 10
H RXTX String verarbeiten Allgemeine Java-Themen 1
S RxTx - langsame Port suche Allgemeine Java-Themen 3
L Software-Design: Kommunikation mit SerialPort (RXTX) Allgemeine Java-Themen 2
R Virtuelle Serielle Schnittstellen mit RXTX Allgemeine Java-Themen 2
G RXTX native library unter Linux in jar build angeben Allgemeine Java-Themen 4
M rxtx OutputStream sendet falsche werte Allgemeine Java-Themen 3
M problem mit rxtx Allgemeine Java-Themen 9
G RXTX in proprietärer Software nutzen?! Allgemeine Java-Themen 10
S RXTX library in Jar einbinden Allgemeine Java-Themen 5
T [RXTX] GPS-Maus (Comport) effizient auslesen Allgemeine Java-Themen 6
T RXTX und 64bit Allgemeine Java-Themen 1
R RXTX Versions Info abschalten Allgemeine Java-Themen 6
T Frage zu Schönheitsfehler bei RXTX Allgemeine Java-Themen 2
C RXTX Treiber einbinden für Linux Allgemeine Java-Themen 6
G RXTX library braucht sehr lange zum laden. Ist das normal? Allgemeine Java-Themen 8
B RXTX sendet immer mit 9600Baud Allgemeine Java-Themen 4
E Erfahrung mit RXTX sowie Windows und Linux Allgemeine Java-Themen 9
G RXTX verschicken einzelener Bytes Allgemeine Java-Themen 8
E javax.comm: Suche eine open source Alternative zu rxtx Allgemeine Java-Themen 8
O RXTX Geschwindigkeit? Codebeispiel dabei. Allgemeine Java-Themen 21
L Exception auslösen, um while Schlaufe zu verlassen(rxtx.org) Allgemeine Java-Themen 6
M Geschwindigkeit RXTX JAVA Allgemeine Java-Themen 3
foobar Rxtx vs javax.comm Allgemeine Java-Themen 2
S Wo .close() einfügen? Allgemeine Java-Themen 0
T NoSuchMethodError: java.net.URLClassLoader.close Allgemeine Java-Themen 3
H Probleme mit finally-Block und close() Allgemeine Java-Themen 4
B Input/Output Datei noch geöffnet trotz Close Allgemeine Java-Themen 4
Meldanor finalize Methode überschreiben für .close() Allgemeine Java-Themen 5
V Was tun, wenn close() fehlschlägt? Allgemeine Java-Themen 3
G Leere Datei mit PrintWriter trotz flush und close Allgemeine Java-Themen 8
T Programm close and reload? Allgemeine Java-Themen 10
D close Problem bei meinem eigenen ToolTip Allgemeine Java-Themen 2
S Die Methode close() der Klasse Scanner Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben