Avatar billede jonas82 Nybegynder
10. november 2006 - 22:59 Der er 6 kommentarer og
1 løsning

Læse en linie af gangen fra stream

Hej,

Jeg har en gps modtager forbundet via comporten der sender gps data som nmea. Jeg prøver at lave så for hver ny linie der sendes får jeg en ny String variabel.

Her er et udsnit af min kode:

SerialPort serialPort = (SerialPort) commPort;
                serialPort.setSerialPortParams(38400,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
               
                InputStream in = serialPort.getInputStream();
BufferedReader bufread = new BufferedReader(new InputStreamReader(in));
            try {
                while(true)
                {
                   
                    System.out.println(bufread.readLine());
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }


Dette printer X antal linier ud med det samme, men kaster så en:
java.io.IOException: Underlying input stream returned zero bytes

Og det er ikke fordi streamen stopper. Den er ret uendelig ;-)
Avatar billede jonas82 Nybegynder
10. november 2006 - 23:08 #1
Det er som om den kun lige udskriver hvad der allerede er bufferet. Den venter ikke på nyt.
Avatar billede winners79 Nybegynder
10. november 2006 - 23:41 #2
prøv og sig:

if (bufread.ready())
System.out.println(bufread.readLine());
Avatar billede arne_v Ekspert
10. november 2006 - 23:43 #3
hvad med:

String line;
while((line = bufread.readLine()) != null) {
  System.out.println(line);
}

?
Avatar billede jonas82 Nybegynder
11. november 2006 - 14:30 #4
Tak for jeres forslag. Jeg får først tid til at kigge på det i aften - vender tilbage.
Avatar billede jonas82 Nybegynder
12. november 2006 - 14:20 #5
winners79 - det gør ingen forskel

arne - det udskriver kun en enkelt linie. Men programmet lukker ikke med en exception.
Avatar billede runr Nybegynder
02. december 2006 - 12:25 #6
Tror måske du skal bruge SerialPortEventListener se http://java.sun.com/products/javacomm/reference/api/javax/comm/SerialPortEventListener.html

Koden kunne se ud noget i retningen af nedenståenden, hvor bufread, readThread er erklæret som klassevariable og klassen implementerer SerialPortEventListener:

SerialPort serialPort = (SerialPort) commPort;
    serialPort.setSerialPortParams(38400,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);

    InputStream in = serialPort.getInputStream();
    bufread = new BufferedReader(new InputStreamReader(in));

    try {
    inputStream = serialPort.getInputStream();
    } catch (IOException e) {}
    try {
    serialPort.addEventListener(this);
    } catch (TooManyListenersException e) {}
        serialPort.notifyOnDataAvailable(true);
                serialPort.notifyOnDataAvailable(true);
        readThread = new Thread(this);
        readThread.start();
    }

    public void run() {
    try {
    Thread.sleep(20000);
    } catch (InterruptedException e) {}
    }

    public void serialEvent(SerialPortEvent event) {
    switch(event.getEventType()) {
    case SerialPortEvent.OUTPUT_BUFFER_EMPTY: break;
    case SerialPortEvent.DATA_AVAILABLE:
    try {
    while((line = bufread.readLine()) != null) {
      System.out.println(line);
    }
    } catch (IOException e) {}
    break;
    }
    }
Avatar billede jonas82 Nybegynder
20. juni 2007 - 22:29 #7
lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester