Erfahrung mit RXTX sowie Windows und Linux

Status
Nicht offen für weitere Antworten.
E

Eike

Gast
Hallo,
ich habe schon eine Frage zu rxtx und einer möglichen Alternative gestellt, aber es gibt wohl keine. Sie würde mein Problem wahrscheinlich auch nicht lösen.

Ich versuch es mal grob zu umreißen. Ich soll eine Wetterstation per SerialPort ansprechen. Unter Linux habe ich die Applikation fertig und es klappt alles wunderbar.
Unter Windows gibt es Rechner, da klappt es und es gibt Rechner, da klappt es gar nicht. Das Problem dabei ist, dass es keine Exceptions gibt, sondern einfach keine Daten im Inputstream des SerialPorts ankommen.

Ich habe schon auf der rxtx-Mailinglist nachgefragt, aber mehr als FlowControl-Einstellungen ändern konnten die mir bisher auch nicht sagen.

Weiß einer von euch Rat?

Welche Informationen benötigt ihr noch?

Die Wetterstation wird per SerialPort angesprochen:
Code:
while(true) aktivierungskommando schicken bis die Station antwortet
    daten abrufen
    daten verarbeiten 
// wiederhole 2 + 3 bis keine aktuellen Daten mehr vorhanden sind
daten ins netz schicken

So, das wäre es erstmal.

Für alle Befehle aus das Aktivieren nutze ich Events.

Code:
ArrayList<Record> data = new ArrayList<Record>(30);
		Configurations config = null;
		Date lastRecordedDate = null;
		int counter = 0;

		if(this.prepareForDownload().statusOK()){

			config = Configurations.instance();

			try {

				log.trace("lastRecordedDate  : " + config.getLastRecordDate());
				log.trace("lastRecordedblock#: " + WS2500Receiver.lastRecordBlockNumber);
				
				lastRecordedDate  = 
					Record.dateFormatter.parseISO8601String(config.getLastRecordDate());

			} catch (ParseException e) {

				log.error("date string \"" + config.getLastRecordDate() + "\" stored in configuration " +
				"could not be parsed");
				
				lastRecordedDate = new Date(0L); 
				
				log.error("lastRecordedDate is set to " + lastRecordedDate);
				
			}

			// this loop will download the data after activating the comm
			download:
				while(counter++ < this.maxRetries){
					boolean commActive = false;
					ActivateCommunication actComm;
					SelectFirstDataSet selFirst;
					GetDataSet getData;
					RecordImpl current;
					int counter_ = 0;
					long lastCommandSend;
					
					this.prepareForDownload();

					// 1 ACTIVATE COMMUNICATION
					while(!commActive && counter_++ < this.maxRetries){
						
						actComm = new ActivateCommunication(this.serialPort);
						actComm.send();

						commActive = actComm.getResult();						

					}
					if(counter_ == this.maxRetries || !commActive){
						log.error("could not activate communication with hws " +
								" via port \"" + this.serialPort.getName() + 
								"\"");

						break download;
					}
					counter_ = 0;

					log.debug("communication activated");

					// 2 DOWNLOAD FIRST DATASET

					do{
						getData = new GetDataSet(this.serialPort);
						getData.send();

						current = getData.getResult();
						getData = null;

					}while(current == null && counter_++ < this.maxRetries);

					// the download failed, 
					if(current == null){
						log.debug("could not download first dataset.");

						continue download;
					}

					if(current.equals(GetDataSet.NO_MORE_DATA)){
						log.info("no data in station memory");

						break download;
					}

					counter_ = 0;

					log.debug("downloaded first dataset: " + current);

					// 3 DOWNLOAD ALL NEW DATA
					download_new_data :
						while(lastRecordedDate.before(current.getTimeOfMeasurement())){
							SetPointerToNextRecord selNext;

							/*
							 *  3.1 CHECK_1
							 * we check the block number to add only new data to
							 * the result set
							 */
							if(current.getBlockNumber() != WS2500Receiver.lastRecordBlockNumber){
								data.add(current);
								WS2500Receiver.lastRecordBlockNumber = current.getBlockNumber();
								lastRecordedDate = current.getTimeOfMeasurement();

								log.debug("record added to resultset");
							}

							// 3.2 SET POINTER TO NEXT RECORD

							do{
								selNext = new SetPointerToNextRecord(this.serialPort);

								lastCommandSend = System.currentTimeMillis();
								selNext.send();

							}while(selNext.getResult() != SetPointerToNextRecord.DATA_AVAILABLE &&
									selNext.getResult() != SetPointerToNextRecord.NO_MORE_DATA &&
									counter_++ < this.maxRetries &&
									(System.currentTimeMillis() - lastCommandSend) < 500);

							if((System.currentTimeMillis() - lastCommandSend) > 500){
								log.debug("command send window closed(310)");
								// break download_new_data;
								continue download;
							}

							counter_ = 0;

							switch (selNext.getResult()) {
							case SetPointerToNextRecord.DATA_AVAILABLE:
								log.debug("pointer set to next dataset");

								// 3.3 DOWNLOAD NEW DATA
								do{
									getData = new GetDataSet(this.serialPort);
									lastCommandSend = System.currentTimeMillis();
									getData.send();

									current = getData.getResult();
									getData = null;

								}while(current == null && 
										counter_++ < this.maxRetries && 
										(System.currentTimeMillis() - lastCommandSend) < 500);

								if((System.currentTimeMillis() - lastCommandSend) > 500){
									log.debug("command send window closed(335)");
									continue download;
									//									break download_new_data;
								}

								if(current == null || counter_ == this.maxRetries){
									log.debug("no data received from station");

									break download;
								}

								if(current.equals(GetDataSet.NO_MORE_DATA)){
									log.debug("no more data in station memory");

									break download;
								}

								break;

							case SetPointerToNextRecord.NO_MORE_DATA:
								log.debug("no more data in station memory");

								// we are done, no more data in station
								break download;

							default:
								continue download; // restart from actComm
							}

						}

				} // END download_new_data
		} // END download
Hier noch ein Ausschnitt aus der prepareForDownload()-Methode.
Code:
String port = "";
		CommPortIdentifier portIdentifier;
		CommPort commPort;
		String errorMessage;

		try {

			port = Configurations.instance().getSerialPort();

			portIdentifier = CommPortIdentifier.getPortIdentifier(port);
			
			if(!portIdentifier.isCurrentlyOwned()){

				commPort = portIdentifier.open(this.getClass().getName(),2000);

				if (commPort instanceof SerialPort) {

					serialPort = (SerialPort) commPort;
					serialPort.setSerialPortParams(BAUDRATE, 
							DATABITS, 
							STOPBITS,
							PARITY);

					serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);

Wird noch mehr Code benötigt?
 
E

Eike

Gast
eine etwas differenziertere Antwort wäre dann echt mal schön!
 
T

tuxedo

Gast
Dein Stil ist einfach, sorry, ich sags mal auf gut deutsch, scheisse.

Die Sache mit den ganzen breaks und continue's ... Sowas macht man in Java und anderen objektorientierten Sprachen einfach nicht.

Kleiner Tipp von meiner Seite:

Ich arbeite im Falle von RS232 kommunikation NIE mit Events. Warum? Gute Frage. Fand das von anfang an etwas "unschön" gelöst.

Ich hab stattdessen einen Thread dafür abgestellt der die Daten ausliest und der Anwendung, welche die Daten dann weiter ver/bearbeitet, bereitstellt.

Könnte mir vorstellen dass das mit der Eventgeschichte bei dir halt nicht so funktioniert.

Du solltest dringend deinen Code "umstrukturieren". Das ist absoluter Spaghetti-Code. Verwende richtige Methoden statt das mit switch/case/break/continues zu lösen.

- Alex
 
E

Eike

Gast
Abgesehen vom schlechten Code (Spaghetti-Style) ist es leider so, dass auch nicht-eventbasierte Kommunikation mit dem SerialPort zu keiner Antwort führt.

Ich habe mir von Rechnern (Windows sowie Linux) die Einstellungen des Ports ausgeben lassen und sie sind auf beiden Rechnern gleich.

Mir erscheint es so, dass es an irgendwelchen Systemeinstellungen unter Windows liegt, habe aber keine Ahnung, an welchen...
 
E

Eike

Gast
Nein, könntest du mir vielleicht ein paar entspr. Kommandos nennen bzw. eine gute Informationsquelle, wie ich die Wetterstation direkt via HyperTerminal ansprechen kann.
 

Saxony

Top Contributor
Hiho,

1. win+r
2." hypertrm" eintippen
3. den ersten Wizard beenden
4. einrichtung neue Verbindung - pseudo Ortskennzahl eingeben
5. entsprechenden Com Port wählen
6. entsprechend dem Handbuch zu deinem Gerät mit diesem kommunizieren

bye Saxony
 
E

Eike

Gast
Wie kann ich denn bitte die Zahlenkombination 1 0 0 4 senden?

Die Verbindung konnte ich unter Windows XP herstellen, aber dann kann ich nur Textdateien bzw. Dateien senden.

In Java schreibe ich das als byte[] einfach in den OutputStream.
 
T

tuxedo

Gast
>> Wie kann ich denn bitte die Zahlenkombination 1 0 0 4 senden?

Einfach eintippen

>>In Java schreibe ich das als byte[] einfach in den OutputStream.

Wenn du mit 1 0 0 4 vier Bytes mit den Werten 1, zwei mal 0 und 4 meinst: Das wird etwas schwieriger. Da solltest du dann mit einem Hexeditor eine File mit diesen 4 Byte anlegen und die dann "senden".

- Alex
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Hat jemand Erfahrung mit OpenMeetings Allgemeine Java-Themen 4
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
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
B RXTX und close Allgemeine Java-Themen 12
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
R -jar der Windows-Registry hinzufügen Allgemeine Java-Themen 1
C jar File mehrfach aufrufen (als Windows Dienst) Allgemeine Java-Themen 5
izoards JAR als Windows Service mit Appache Procrun (prunsrv) Allgemeine Java-Themen 6
N JAVA-Code mit Grafikfenster zeichnet in Windows, aber nicht Mac. Allgemeine Java-Themen 4
HerrBolte Seltsamer Fehler nur in der Windows- und nicht in der Java-Console O_O Allgemeine Java-Themen 16
N iText keine Sonderzeichen und Umlaute unter Windows Allgemeine Java-Themen 13
MarekLanger Filebeat in Docker unter Windows Allgemeine Java-Themen 1
M Registry Autostart Eintrag mit Java erstellen (über Windows cmd) Allgemeine Java-Themen 7
S Java-Task-Management-Tool für Windows und Mac selber programmieren Allgemeine Java-Themen 4
M Console geht nicht auf (Windows 10) Allgemeine Java-Themen 3
M TomEE auf Windows Server 2016 installieren Allgemeine Java-Themen 4
Thallius Rätsel für Windows Profis Allgemeine Java-Themen 8
F Java Code ausführen direkt nach Anmelden in Windows Allgemeine Java-Themen 2
J jar Dateien unter Windows 7 mit spezifischer jdk öffnen Allgemeine Java-Themen 2
T Java Windows sounds erkennen Allgemeine Java-Themen 1
P Java als Windows Dienst Allgemeine Java-Themen 2
I GUI für kleine Pop-Ups unter Windows Allgemeine Java-Themen 1
H Änderung im maximalen heap space unter Windows 7 ?! Allgemeine Java-Themen 5
dereki2000 Windows Benachrichtigung erzeugen Allgemeine Java-Themen 2
Neumi5694 Task-Name unter Windows Allgemeine Java-Themen 4
M Checkliste mit erweiterbaren Einträgen, Baumstruktur, wie Windows Explorer Navigation Allgemeine Java-Themen 2
S Java OpenOffice Problem mit Windows-Benutzerwechsel Allgemeine Java-Themen 19
R JDK installieren JDK / Maven auf Windows 10 installieren Allgemeine Java-Themen 9
K jar-Datei lässt sich unter Windows nicht verwenden Allgemeine Java-Themen 3
Blender3D Java Swing Programm Windows 10 Autostart Problem Allgemeine Java-Themen 2
D Jsch nur für Windows? Allgemeine Java-Themen 2
X JDK installieren Weiß jemand, wie ich GCJ (WINDOWS) installieren und anwenden kann? Allgemeine Java-Themen 11
D JRE in .jar verpacken unter Windows Allgemeine Java-Themen 4
I Programm im Hintergrund bei Windows zur Steuerung der Tastatur nutzen Allgemeine Java-Themen 2
D Aktuell installierte Java Version auslesen unter Windows Allgemeine Java-Themen 5
S Executable Jar File startet nicht unter Windows 10 Allgemeine Java-Themen 3
C Windows RCP Application unter Linux bauen lassen Allgemeine Java-Themen 3
E Anwendung verhält sich unter Mac anders als Unter Windows. Allgemeine Java-Themen 4
S JNLP startet seit 1.8.0_31 sehr langsam + Windows-Systemverzeichnis Allgemeine Java-Themen 3
M Windows 98 - Mit welchem JDK (Version) kann noch Programm dafür erstellt werden Allgemeine Java-Themen 6
Tom299 Beliebiges Windows-Programm / Prozess in den Vordergrund bringen Allgemeine Java-Themen 4
D Konsoleneingabe ist in Windows CMD nicht sichtbar Allgemeine Java-Themen 4
P Effizientes Programmieren - oder Windows Autostart fürs Herunterfahren Allgemeine Java-Themen 11
O Zugriff auf Windows Zertifikatstore Allgemeine Java-Themen 2
F Windows Umlaute Allgemeine Java-Themen 15
T Windows-Kontextmenü Eintrag hinzufügen? Allgemeine Java-Themen 3
O Socket-Unterschiede zwischen Windows und Ubuntu Allgemeine Java-Themen 2
G Wie installiere ich javax-usb unter windows? Allgemeine Java-Themen 0
M Swing Windows und Ubuntu Allgemeine Java-Themen 4
H JFileChooser soll NUR Windows-Netzwerkumgebung anzeigen Allgemeine Java-Themen 2
L Windows CMD werte Parsen. Allgemeine Java-Themen 2
M Code läuft unter windows aber nicht unter Linux Allgemeine Java-Themen 6
HarleyDavidson Tomcat VS Windows Scheduled Task Allgemeine Java-Themen 4
T JNI: kein Zugriff auf VM in Callback-Methode eines Windows-Hooks Allgemeine Java-Themen 3
W Windows (Service) Hooking Allgemeine Java-Themen 8
M Java auf Linux und Windows Allgemeine Java-Themen 6
R Windows-Firewall lässt Java nicht durch Allgemeine Java-Themen 17
R Java-Progamm über Icon starten unter Windows Allgemeine Java-Themen 9
N Input/Output Mit Windows 7 erzeugtes zip-File in Java 7 öffnen Allgemeine Java-Themen 5
P Eclipse Unter Windows erstelle .jar unter Linux (Ubuntu) funktioniert nicht Allgemeine Java-Themen 5
R ZIP FileSystem unter Windows wirft exception Allgemeine Java-Themen 7
njans Windows Verknüpfung von Icon Allgemeine Java-Themen 2
P windows mit java bedienen Allgemeine Java-Themen 8
X Windows-Environment-Variable per jRegistryKey anpassen Allgemeine Java-Themen 6
P .Jar Datein Windows Konsole zugewiesen Allgemeine Java-Themen 3
C Encoding Problem Windows Allgemeine Java-Themen 9
L Input/Output ProcessBuilder und Windows - Konsole verbergen? Allgemeine Java-Themen 5
R Welches User-Verzeichnis wählen für Configurationsdateien - Windows Allgemeine Java-Themen 2
R Änderungen in einem Verzeichnis beobachten - Windows Allgemeine Java-Themen 3
A Nach Benutzerwechsel mit anderem Account in Windows anmelden Allgemeine Java-Themen 8
T Jar File läuft unter Windows aber nicht unter linux Allgemeine Java-Themen 10
B Windows Konsolenbefehle Allgemeine Java-Themen 3
Z Probleme bei Stringvergleichen (Windows/Linux) Allgemeine Java-Themen 10
B Windows Shutdown abfangen Allgemeine Java-Themen 10
E CMD Registry Key für Windows 7? Allgemeine Java-Themen 9
TiME-SPLiNTER vlcj und Windows Allgemeine Java-Themen 15
S Prozess der von anderem Prozess gestartet wurde beenden? (Windows Bildschirmtastatur) Allgemeine Java-Themen 4
G Input/Output URLDecoder.decode - Unterschiedliche Ergebnisse Windows / Linux Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben