kommunikation zw. objekten

Status
Nicht offen für weitere Antworten.

originalflo

Mitglied
hi folks,

ich arbeite momentan an einem projekt bei dem ich bidirektionale serielle kommunikation benötige.
ich benutze die java comm api 2.0 für windows.
die serielle kommunikation klappt gut, allerdings habe ich ein verständnis-/design- problem.

ich habe zum test eine klasse TestSerialConnection in mit einer Main methode, in der der Programmfaden abläuft, anglegt.

in der main methode instanziere ich erst die parameterklasse, setze comport parameter und instanziere anschließend die SerialConnection. die objekte sind da und ich kann z.B. was auf die Serielle rausschreiben.

Wenn daten reinkommen wirft die comm api einen event und die daten sind im SerialConnection objekt verfügbar. momentan gebe ich sie über system.out.println aus.

ich will allerdings mit den inputdaten in meinem TestSerialConnection objekt arbeiten und intelligent auf die inputdaten antworten!

und hier meine eigentliche frage:

ist es möglich dass das SerialConnection objekt ein event an die TestSerialConnection schickt und sagt: "ich hab daten für dich, mach damit was du willst!" oder geht es nur in dem ich das SerialConnection objekt immer vom TestSerialConnection objekt aus frage: "hast du daten?"

anbei der quellcode

danke für eure hilfe!
flo

Code:
public class TestSerialConnection {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SerialParameters serialProps = new SerialParameters();
		serialProps.setPortName("COM2");
		serialProps.setBaudRate(9600);
		serialProps.setDatabits(8);
		serialProps.setStopbits(1);
		
	    SerialConnection serialConn = new SerialConnection(serialProps);
	    try {
	    	serialConn.openConnection();	
	    } catch (SerialConnectionException e2) {
	    	System.out.println("Error open COM: " + serialProps.getPortName());
	    }
	    
	    serialConn.write("teststring\r\n");
	}
}
Code:
public class SerialConnection implements SerialPortEventListener, CommPortOwnershipListener {	
    private SerialParameters parameters;
    private OutputStream os;
    private InputStream is;

    private CommPortIdentifier portId;
    private SerialPort sPort;

    private boolean open;
    
    public SerialConnection(SerialParameters parameters) {
    	this.parameters = parameters;
    	this.open = false;
    }

   public void openConnection() throws SerialConnectionException {

	try {
	    portId = CommPortIdentifier.getPortIdentifier(parameters.getPortName());
	} catch (NoSuchPortException e) {
	    throw new SerialConnectionException(e.getMessage());
	}

	try {
	    sPort = (SerialPort)portId.open("SerialConnection", 30000);
	    System.out.println(portId.getName() + " opened for serial communication");
	} catch (PortInUseException e) {
	    throw new SerialConnectionException(e.getMessage());
	}

	try {
	    setConnectionParameters();
	} catch (SerialConnectionException e) {	
	    sPort.close();
	    throw e;
	}

	try {
	    os = sPort.getOutputStream();
	    is = sPort.getInputStream();
	} catch (IOException e) {
		// ignore this because often the serial port will be idle
	    //sPort.close();
	    //throw new SerialConnectionException("Error opening i/o streams");
	}

	// Add this object as an event listener for the serial port.
	try {
	    sPort.addEventListener(this);
	} catch (TooManyListenersException e) {
	    sPort.close();
	    throw new SerialConnectionException("too many listeners added");
	}

	// Set notifyOnDataAvailable to true to allow event driven input.
	sPort.notifyOnDataAvailable(true);

	// Set receive timeout to allow breaking out of polling loop during
	// input handling.
	try {
	    sPort.enableReceiveTimeout(30);
	} catch (UnsupportedCommOperationException e) {
	}

	// Add ownership listener to allow ownership event handling.
	portId.addPortOwnershipListener(this);

	this.open = true;
    }

    /**
    Sets the connection parameters to the setting in the parameters object.
    If set fails return the parameters object to origional settings and
    throw exception.
    */
    public void setConnectionParameters() throws SerialConnectionException {

		// Set connection parameters, if set fails return parameters object
		// to original state.
		try {
		    sPort.setSerialPortParams(parameters.getBaudRate(),
					      parameters.getDatabits(),
					      parameters.getStopbits(),
					      parameters.getParity());
		} catch (UnsupportedCommOperationException e) {
		    throw new SerialConnectionException("Unsupported parameter");
		}

		// Set flow control.
		try {
		    sPort.setFlowControlMode(parameters.getFlowControlIn() 
				           | parameters.getFlowControlOut());
		} catch (UnsupportedCommOperationException e) {
		    throw new SerialConnectionException("Unsupported flow control");
		}
    }

    /**
    Close the port and clean up associated elements.
    */
    public void closeConnection() {
    	// If port is alread closed just return.
    	if (!this.open) return;

		// Check to make sure sPort has reference to avoid a NPE.
		if (sPort != null) {
		    try {
			// close the i/o streams.
		    	os.close();
		    	is.close();
		    } catch (IOException e) {
		    	System.err.println(e);
		    }
	
		    // Close the port.
		    sPort.close();
	
		    // Remove the ownership listener.
		    portId.removePortOwnershipListener(this);
		    System.out.println(portId.getName() + " closed");
		}
		this.open = false;
    }

    /**
    Send a one second break signal.
    */
    public void sendBreak() {
	  sPort.sendBreak(1000);
    }

    /**
    Reports the open status of the port.
    @return true if port is open, false if port is closed.
    */
    public boolean isOpen() {
	  return this.open;
    }

	    /**
	    Handles SerialPortEvents. The two types of SerialPortEvents that this
	    program is registered to listen for are DATA_AVAILABLE and BI. During 
	    DATA_AVAILABLE the port buffer is read until it is drained, when no more
	    data is availble and 30ms has passed the method returns. When a BI
	    event occurs the words BREAK RECEIVED are written to the messageAreaIn.
	    */

    public void serialEvent(SerialPortEvent e) {
	 	// Create a StringBuffer and int to receive input data.
		StringBuffer inputBuffer = new StringBuffer();
		int newData = 0;
	
	    // Read data until -1 is returned. If \r is received substitute
	    // \n for correct newline handling.
		while (newData != -1) {
	    	try {
	    	    newData = is.read();
			    if (newData == -1) break;
			    
			    if ('\r' == (char)newData) {
			    	inputBuffer.append('\n');
			    } else {
			    	inputBuffer.append((char)newData);
			    }
	    	} catch (IOException ex) {
	    	    System.err.println(ex);
	    	    return;
	      	}
		}

		// print input
		System.out.print(inputBuffer);
    }
    
    public void ownershipChange(int type) {
		if (type == CommPortOwnershipListener.PORT_OWNERSHIP_REQUESTED) {
			System.out.print("An other application tries to use the selected com-port: ignore it ;-)\n");
		}
    }

    public void write (String data) {
    	try {
    		byte sendbytes[] = data.getBytes();
    		
    		os.write(sendbytes);
    	} catch (IOException e) {
    		System.err.println("OutputStream write error: " + e);
    	}
    }
}
 

Lex

Mitglied
Morgen,

du kannst ein Interface definieren, das von TestSerialConnection implementiert wird.
Mit TestSerialConnection registierst du dich dann an SerialConnection, da brauchste dann nur noch die Methode des Interfaces aufrufen, wenn neue Daten da sind.

MfG
Lex
 

originalflo

Mitglied
hi lex,

danke für den tipp...

bin schon über observer/observable und custom listeners gestolpert aber noch nicht so wirklich weitergekommen.....

um zu deinem tipp zurückzukommen:

ich verstehe nicht ganz was du mit: "Mit TestSerialConnection registierst du dich dann an SerialConnection" gemeint hast.


danke

ciao
flo
 

moormaster

Top Contributor
Zum Beispiel:

Die SerialConnection merkt sich ein Objekt, welches ein Interface (z.B. SerialDataReceiver genannt) implementiert.

In diesem Interface definierst du für jedes Ereignis eine Methode, welche jeweils auch Parameter entgegen nehmen kann (z.B. empfangene Daten).

Code:
 public class SerialConnection
 {
  SerialDataReceiver receiver;

  ...

  public void setReceiver(SerialDataReceiver rcv)
  {
   this.receiver = rcv;
  }
 }

Per setReceiver Methode kann nun ein Objekt, welches SerialConnectionReceiver implementiert, dort angemeldet werden.

Tritt nun in SerialConnection ein Ereignis auf, könntest du jeweils überprüfen, ob ein Receiver gesetzt wurde (receiver != null) und wenn ja, rufst du einfach die entsprechende Methode für das jeweilge Ereignis auf und gibst die Daten so weiter.

[edit]
Das Ganze kann man auch noch weiter treiben, in dem man mehrere gleichzeitig registrierte Objekte zulässt. Dann würdest du eben statt eines SerialDataReceiver's einfach eine Collection aus SerialDataReveiver'n speichern.

Die Methode setReceiver würde dann natürlich entsprechend ersetzt durch add- bzw. remove- Methoden.
[/edit]
 

Lex

Mitglied
Die Methode zum übergeben der Daten ruft du auf wenn neue Daten da sind.
Mit moormasters Beispiel sähe das dann so aus:

Code:
/* Neue Daten empfangen */

receiver.postData(String data);

In deiner TestSerialConnection haste dann so was stehen:

Code:
public void postData(String data){
   System.out.println(data);
   /*oder was auch immer du noch machen willst */
}

MfG
Lex
 

originalflo

Mitglied
soweit einleuchtend und eine grosse hilfe - es funktioniert.

jetzt hab ich nur noch ne kleine verständnisfrage zum schluss....

weil's auf diese weise hats nicht geklappt hat:

Code:
serialConn.setReceiver(this); //Cannot use this in a static context

hab ich es folgendermaßen gelöst:
Code:
TestSerialConnection tsc = new TestSerialConnection(); // erster aufruf in main methode vno TestSerialConnection
serialConn.setReceiver(tsc);

ist meine variante auch der richtige weg oder ein workaround?
 

Lex

Mitglied
Die Registration von TestSerialConnection an SerialConnection würde ich im Construktor machen und in einer anderen Klassse dann die main-Mehtode implementieren, die dein Programm startet.

this funktioniert nicht da in der main-Methode kein Objekt der Klasse vorhanden ist auf das du referenzieren kannst.

MfG
Lex
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
CptK Backpropagation parallelisieren: Kommunikation zwischen den Threads Allgemeine Java-Themen 7
L Kommunikation zwischen C# und Java? Allgemeine Java-Themen 5
R PIPE Kommunikation mit Prozess blockiert Allgemeine Java-Themen 0
M Checksummenprüfung bei Client Server kommunikation Allgemeine Java-Themen 3
D Interthread-Kommunikation Allgemeine Java-Themen 6
S Threads Kommunikation zwischen SocketThread und WorkerThread Allgemeine Java-Themen 11
0 Lösungsweg Client Server Kommunikation Fehlermeldung ausgeben Allgemeine Java-Themen 12
L Software-Design: Kommunikation mit SerialPort (RXTX) Allgemeine Java-Themen 2
F Serielle Kommunikation Allgemeine Java-Themen 20
A Kommunikation zwischen 2 Jar-dateien Allgemeine Java-Themen 16
S Kommunikation von Core und GUI über Schnittstellen Allgemeine Java-Themen 2
P Komponenten kommunikation Allgemeine Java-Themen 7
L Serielle Kommunikation Allgemeine Java-Themen 6
G Implementierung einer Kommunikation Allgemeine Java-Themen 7
B SerialPort Kommunikation - Pufferüberlauf Allgemeine Java-Themen 6
0 Sandbox und Applet Kommunikation Allgemeine Java-Themen 9
E kommunikation zwischen Fenstern Allgemeine Java-Themen 3
H Java C++ Interprozess Kommunikation Allgemeine Java-Themen 7
D Klassen Kommunikation Allgemeine Java-Themen 11
M Applet Servlet Kommunikation ein Problem bei externem Server Allgemeine Java-Themen 3
F Kommunikation zw 2 Java-Programmen mit unterschiedl Compiler Allgemeine Java-Themen 13
G Kommunikation mit Remotegeräten Allgemeine Java-Themen 2
A Kommunikation zwischen C++ und Java-Programm Allgemeine Java-Themen 4
J Kommunikation mit USB Gerät, das Midi-Signale sendet Allgemeine Java-Themen 4
G Kommunikation mit der seriellen Schnittstelle Allgemeine Java-Themen 6
H Kommunikation mit einem c-Prozess funzt nicht richtig Allgemeine Java-Themen 5
C Pattern für Kommunikation gesucht Allgemeine Java-Themen 3
B Kommunikation mit entferntem Thread Allgemeine Java-Themen 6
G Kommunikation von zwei Java-Programmen Allgemeine Java-Themen 3
N Inter-Thread-Kommunikation Allgemeine Java-Themen 3
M Kommunikation mit externem Programm ueber Linux-Pipes Allgemeine Java-Themen 4
M Kommunikation zwischen 2 Programmen Allgemeine Java-Themen 7
G Kommunikation zwischen Threads und Gui Allgemeine Java-Themen 2
T Kommunikation mit batch datei Allgemeine Java-Themen 3
P kommunikation zwischen dialog und threads Allgemeine Java-Themen 4
K MVC - Kommunikation Controller <> Gui Allgemeine Java-Themen 5
P Kommunikation von Threads Allgemeine Java-Themen 5
V Kommunikation zwischen Programmen und Threads Allgemeine Java-Themen 7
H Servlet/Applet Kommunikation Allgemeine Java-Themen 2
C Kommunikation mit USB Port Allgemeine Java-Themen 1
Zrebna Wieso sollte man Null-Prüfungen nicht mit Optional-Objekten nutzen? Allgemeine Java-Themen 13
B Sent and Receive Funktionen zwischen Objekten ermöglichen? Allgemeine Java-Themen 8
A Objekt aus anderen Objekten machen Allgemeine Java-Themen 8
PCOmega137 Objekten zufällig erzeugte Namen geben Allgemeine Java-Themen 2
T Speichern von Objekten Allgemeine Java-Themen 2
D Serialisierung und Deserialisierung von Objekten - Frageprogramm Allgemeine Java-Themen 4
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
M loeschen von objekten Allgemeine Java-Themen 22
S Parametrisierte jUnit 5-Tests mit eigenen Datentypen/Klassen-Objekten als Test-Parameter Allgemeine Java-Themen 0
F Best Practice Große Anzahl an Objekten speichern und lesen Allgemeine Java-Themen 19
M Array aus Thread Objekten erstellen Allgemeine Java-Themen 2
K Vergleich von Strings von Objekten Allgemeine Java-Themen 4
B Endlosschleife beim Verteilen von Objekten Allgemeine Java-Themen 4
L Von ArrayList abgeleitete Klasse nur mit bestimmten Objekten füllen Allgemeine Java-Themen 1
D Verwaltung von sehr vielen Objekten Allgemeine Java-Themen 12
G problem: array aus objekten Allgemeine Java-Themen 10
H Liste von Objekten generisch sortieren Allgemeine Java-Themen 0
S Zur Laufzeit Klasse mit einer anzahl von X Objekten erstellen Allgemeine Java-Themen 5
B OOP Auf Zustandsänderungen von Objekten reagieren Allgemeine Java-Themen 2
H Best Practice zu vielen konstanten Objekten? Allgemeine Java-Themen 10
M 3D-Grafik Probleme beim drehen von Objekten Allgemeine Java-Themen 9
A Sinnvolles Software Design bei Eigenschaftsänderungen von Objekten Allgemeine Java-Themen 7
J Java-Implementierung diverser Beziehungen zwischen Klassen bzw. Objekten Allgemeine Java-Themen 2
S Threads Liste mit Objekten in Teillisten zerlegen und abarbeiten Allgemeine Java-Themen 3
P J-Unit vergleich von 2 Objekten merkwürdig Allgemeine Java-Themen 7
Landei Guice - Injection von "zwischendurch" erzeugten Objekten Allgemeine Java-Themen 4
S Sortieren nach Objekten Allgemeine Java-Themen 13
T Liste mit GregorianCalendar-Objekten in List einlesen, mit Collection sortieren und ausgeben Allgemeine Java-Themen 3
D Von mehreren Objekten eine Eigenschaft abfragen Allgemeine Java-Themen 11
G Array mit neuen Objekten der selben Klasse füllen Allgemeine Java-Themen 2
S Eine Collection von Objekten mit LDAP Syntax filtern Allgemeine Java-Themen 5
M Schnittmenge von Objekten Allgemeine Java-Themen 3
N Performates lesen von Objekten aus Dateien Allgemeine Java-Themen 2
hdi Speichergröße von Objekten & Referenzen Allgemeine Java-Themen 8
hdi JTable: Sortierung von Date-Objekten Allgemeine Java-Themen 4
C ArrayList (mit Objekten) sortieren Allgemeine Java-Themen 12
C TreeSet mit Objekten befüllen Allgemeine Java-Themen 12
L Lesen von Objekten aus Datei Allgemeine Java-Themen 17
S Liste mit verschiedenden Objekten Allgemeine Java-Themen 15
I Vector mit Objekten sortieren,Videos mit JMF wiedergeben Allgemeine Java-Themen 6
J ArrayList aus Point-Objekten nach dem x-Wert ordnen Allgemeine Java-Themen 2
T abspeichern und laden von objekten in JFrame Allgemeine Java-Themen 2
G Serialisieren von Objekten : IO Exception beim Schreiben Allgemeine Java-Themen 3
G Kompletten Frame mit allen Objekten resizen Allgemeine Java-Themen 10
G Tagesdifferenz zw. 2 Gregorian Objekten Allgemeine Java-Themen 14
M Endgültiges Löschen von Objekten Allgemeine Java-Themen 7
M Problem mit Objekten Allgemeine Java-Themen 11
B Serialisieren von mehreren Objekten Allgemeine Java-Themen 7
W Threads & Pipes --> Ist eine Übergabe von Objekten mö Allgemeine Java-Themen 7
T casten von Objekten aus einer ArrayList Allgemeine Java-Themen 4
G List mit selbstdefinierten Objekten sortieren Allgemeine Java-Themen 2
T Unabhängigkeit von Variablen/ Objekten. Allgemeine Java-Themen 6
M String aus array mit Objekten suchen Allgemeine Java-Themen 26
F Array von Objekten Allgemeine Java-Themen 2
B Darstellung von Objekten dauern unterschiedlich lang ! Allgemeine Java-Themen 5
G hashtable mit objekten Allgemeine Java-Themen 9
G Probleme mit Clonen von Objekten die JComponents enthalten Allgemeine Java-Themen 3
M Alle möglichen Kombinationen von mehreren Objekten berechnen Allgemeine Java-Themen 6
D OOP-Style bei Objekten Allgemeine Java-Themen 35
H Speicher freigeben klappt nicht bei Image Objekten, warum? Allgemeine Java-Themen 8

Ähnliche Java Themen

Neue Themen


Oben