Gå til innhold

Hvordan passivt vente på data fra en Inputstream


Anbefalte innlegg

Hei igjen,

 

Emnetittelen er lite beskrivende igrunn, men kommer ikke på noe bedre for øyeblikket.

 

Driver og lager en applikasjon som skriver til og leser fra devicer som er koblet til serieporter. Jobber for tiden med to slike devicer, de kommuniserer trådløst med hverandre - altså det eneste jeg sender over serieporten er kommandoer for å initiere meldingsutveksling eller for å lese noen konfigurasjonsparametere. Uansett, over til problemet:

 

Når jeg trykker "connect" i GUIet mitt oppretter jeg en tilkobling til den aktuelle serieporten (bruker http://johnsjavapda.blogspot.com/2007/12/r...ementation.html for å koble til serieporten). Det jeg da ønsker er at det skal startes en "leser" som kontinuerlig venter på input på den aktuelle inputstreamen. Mens jeg venter skal jeg selvfølgelig kunne sende kommandoer ut på outputstreamen.

 

Er ganske mye kode jeg har skrevet, men legger ved utdrag fra de tre viktigste klassene. Bruker den berømte trelagsarkitekturen, utdragene jeg har lagt ved kommer i "riktig" rekkefølge.

Håper noen kan hjelpe.

 

public class SerialPortConnection extends LogicClass {

String portName;
UARTConnection connection;
String statusMessage;
SerialPort serialPort;
ZB_ReadConfiguration zb_ReadConfiguration;
GUI gui;

public SerialPortConnection(String portName,GUI gui){

	this.portName = portName;
	this.gui = gui;

}

public void openConnection(){
	connection = new UARTConnection();

	setSerialPort(connection.connect(this.portName));
	String deviceType = "";
	String msg = "";
	if(getSerialPort() != null){

		new Thread(new ReceiverClass(getSerialPort(),this.gui)).start();
		System.out.println("HER");

		getDeviceLogicalType();
	}
	setStatusMessage(connection.getReturnMessage() +"\n" + deviceType + "\n" + msg);
}
}

 

public class ReceiverClass extends LogicClass implements Runnable {

SerialPort serialPort;
boolean dataArrived = false;
int[] inputBuffer;
GUI gui;

public ReceiverClass(SerialPort serialPort,GUI gui){
	this.serialPort = serialPort;
	this.gui = gui;
}

public void run(){
	System.out.println("I receiverclass.run");
	Thread readerThread = new Thread(new Reader(this.serialPort,this));
	readerThread.start();

	while(!dataHasArrived()){

		if(dataHasArrived()){
			gui.dataReceived(getCommand(getInputBuffer()));
			break;
		}
	}
}

public boolean dataHasArrived(){
	return this.dataArrived;
}

public void notifyDataArrivedDataArrived(boolean dataArrived){
	this.dataArrived = dataArrived;
}
}

 

public class Reader extends IOClass implements Runnable{
InputStream in;
SerialPort serialPort;
public static boolean go = true;
public boolean receiving;
int[] inputBuffer = new int[1024];
ReceiverClass receiverClass;

public Reader(SerialPort serialPort,ReceiverClass receiverClass) {
	this.serialPort = serialPort;
	this.in = createInputStream(this.serialPort);
	this.receiverClass = receiverClass;
}

public void run(){
	System.out.println("I reader.run");
	ArrayList<Integer> dataList = new ArrayList<Integer>();
	try{
		int data = this.in.read();

		while(data != -1){
			System.out.println("data mottatt");
			dataList.add(data);
			data = this.in.read();
			if(data == -1){
				this.receiverClass.setInputBuffer(dataList);
				this.receiverClass.notifyDataArrivedDataArrived(true);
				break;
			}
		}
	}
	catch(IOException e){
		e.printStackTrace();
	}
}
}

Lenke til kommentar
Videoannonse
Annonse

Tja ... Readeren din kan vel implementere et eller annet lyttbart grensesnitt og fyre av events for nye meldinger mottatt, om strømmen har blitt lukket m.m. og så kan den som oppretter denne leseren lytte på events.

 

run()-metoden i reader kan jo forsåvidt bare sleepe så lenge den ikke har fått noe. Du kan ha en evig while-loop som sleep-er i noen millisekunder, tester om det har kommet nye beskjeder, hvis det har det, fyr av event, sleep og loop.

Lenke til kommentar
  • 3 uker senere...

Du kan bruke java.nio til å lage en uendelig loop som blir "interrupted" hver gang det kommer noe data.

 

http://onjava.com/pub/a/onjava/2002/09/04/nio.html?page=2

 

Dvs at du ikke har noe Thread.sleep(1000); e.l., mao en passiv loop.

 

(Eksempelet er for tcp/ip porter, men antar du kan lytte på seriell-porter også...)

 

Hmm fant et eksempel for seriel-porter:

http://en.wikibooks.org/wiki/Serial_Progra...l_Communication

Endret av blackbrrd
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...