The Hoff Skrevet 23. juli 2009 Del Skrevet 23. juli 2009 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
pgdx Skrevet 25. juli 2009 Del Skrevet 25. juli 2009 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
blackbrrd Skrevet 11. august 2009 Del Skrevet 11. august 2009 (endret) 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 11. august 2009 av blackbrrd Lenke til kommentar
pgdx Skrevet 11. august 2009 Del Skrevet 11. august 2009 However, in typical Sun half-arsed manner this mechanism is not without problems.Hehe, nice one, Wikibooks! Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå