Avatar billede mortendalby Nybegynder
13. november 2004 - 00:27 Der er 49 kommentarer og
1 løsning

Java proram som kan modtage data på seriel og skrive til fil

Jeg er igang med at lave en temperaturmåler og vil gerne have temperaturen vist i grafer på mrtg.
Jeg tænkte så om der var nogen der havde et java program til at ligge, som kan modtage data fra RS232, og skrive det til en fil.

Håber at der er nogen der kan hjælpe.
Avatar billede arne_v Ekspert
13. november 2004 - 00:30 #1
Jeg har ikke kode liggende.

Men du skal jo nok have fat på:
  http://java.sun.com/products/javacomm/index.jsp
Avatar billede mortendalby Nybegynder
13. november 2004 - 11:43 #2
Jeg har været ved at kigge på det, men jeg er ikke den store koder :-(
Avatar billede mortendalby Nybegynder
13. november 2004 - 17:34 #3
Så har jeg fundet en javakode som læser fra com porten. Nu mangler jeg bare at få det skrevet til en fil. Data'ene (temperaturen) skal gerne opdateres hele tiden i filen.
Er der nogen der kan hjælpe mig?

Her er koden:

import java.io.*;
import java.util.*;
import javax.comm.*;

public class SimpleRead implements Runnable, SerialPortEventListener {
    static CommPortIdentifier portId;
    static Enumeration portList;

    InputStream inputStream;
    SerialPort serialPort;
    Thread readThread;

    public static void main(String[] args) {
        portList = CommPortIdentifier.getPortIdentifiers();

        while (portList.hasMoreElements()) {
            portId = (CommPortIdentifier) portList.nextElement();
            if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
                if (portId.getName().equals("COM1")) {
                //if (portId.getName().equals("/dev/term/a")) {
                    SimpleRead reader = new SimpleRead();
                }
            }
        }
    }

    public SimpleRead() {
        try {
            serialPort = (SerialPort) portId.open("SimpleReadApp", 2000);
        } catch (PortInUseException e) {}
        try {
            inputStream = serialPort.getInputStream();
        } catch (IOException e) {}
    try {
            serialPort.addEventListener(this);
    } catch (TooManyListenersException e) {}
        serialPort.notifyOnDataAvailable(true);
        try {
            serialPort.setSerialPortParams(9600,
                SerialPort.DATABITS_8,
                SerialPort.STOPBITS_1,
                SerialPort.PARITY_NONE);
        } catch (UnsupportedCommOperationException e) {}
        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.BI:
        case SerialPortEvent.OE:
        case SerialPortEvent.FE:
        case SerialPortEvent.PE:
        case SerialPortEvent.CD:
        case SerialPortEvent.CTS:
        case SerialPortEvent.DSR:
        case SerialPortEvent.RI:
        case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
            break;
        case SerialPortEvent.DATA_AVAILABLE:
            byte[] readBuffer = new byte[20];

            try {
                while (inputStream.available() > 0) {
                    int numBytes = inputStream.read(readBuffer);
                }
                System.out.print(new String(readBuffer));
            } catch (IOException e) {}
            break;
        }
    }
}
Avatar billede arne_v Ekspert
13. november 2004 - 17:40 #4
Skriv til fil er nemt:

      PrintWriter pw = new PrintWriter(new FileWriter(new File(filnavn)));
      pw.println(noget);
      pw.close();
Avatar billede mortendalby Nybegynder
13. november 2004 - 19:59 #5
jeg har prøvet at sætte det ind som du har skrevet, men jeg får en fejl. Kan du se hvad det kan være?

Her er det stykke hvor jeg har sat det ind:

            try {
                while (inputStream.available() > 0) {
                    int numBytes = inputStream.read(readBuffer);
                }
                //System.out.print(new String(readBuffer));
    (fejl?)      PrintWriter pw = new PrintWriter(new FileWriter(new File(filnavn)));
                pw.println(readBuffer);
                pw.close();
                                           

            } catch (IOException e) {}
            break;
        }
    }
}
Avatar billede arne_v Ekspert
13. november 2004 - 20:11 #6
filnavn skal siikert erstattes af et rigtigt filnavn
Avatar billede mortendalby Nybegynder
13. november 2004 - 20:34 #7
Jeg har prøvet at skifte "filnavn" ud, men det fungere ikke.
Javabeans melder flg. fejl:

Cannot resolve symbol
Symbol : variable filnavn
location : class SimpleRead


Har du et forslag til hvad det skal skiftes ud med
Avatar billede arne_v Ekspert
13. november 2004 - 20:36 #8
fejlbeskeden siger jo klart at variablen filnavn ikke eksisterer så ...
Avatar billede jenvest Nybegynder
14. november 2004 - 11:41 #9
har du husket at have en endelse på dit filnavn, eks. nyfil.txt
Avatar billede mortendalby Nybegynder
14. november 2004 - 13:16 #10
Hej jens. Jeg har sku prøvet at rette det til alt muligt. Jeg synes ikke lige at jeg kan se hvad det skal være :-(
Avatar billede arne_v Ekspert
14. november 2004 - 13:48 #11
Hvis du nu skriver:

PrintWriter pw = new PrintWriter(new FileWriter(new File("C:\\foobar.txt")));

hvad så ?
Avatar billede mortendalby Nybegynder
14. november 2004 - 15:02 #12
så virker det :-) men jeg får et underligt output. Hvordan får man den til at skrive det ud som en string?
Avatar billede arne_v Ekspert
14. november 2004 - 15:04 #13
Jeg tror at du mener

pw.println(new String(readBuffer));
Avatar billede mortendalby Nybegynder
14. november 2004 - 15:18 #14
så kommer der tal ud, men det er kun 4 som står i filen. Når man skriver det ud til skærmen ser det sådan her ud 4 0020.15 (4 står får sensor nr. 4)
Avatar billede mortendalby Nybegynder
14. november 2004 - 15:20 #15
temperaturen bliver opdateret hver sekund fra temperaturmodulet
Avatar billede arne_v Ekspert
14. november 2004 - 15:36 #16
PrintWriter pw = new PrintWriter(new FileWriter(new File("C:\\foobar.txt", true)));
Avatar billede mortendalby Nybegynder
14. november 2004 - 15:48 #17
så melder den fejl:

Cannot resolve symbol
Symbol : constructor File (java.lang.string.boolean)
location : class java.io.file
Avatar billede arne_v Ekspert
14. november 2004 - 15:55 #18
Sorry

PrintWriter pw = new PrintWriter(new FileWriter(new File("C:\\foobar.txt"), true));
Avatar billede mortendalby Nybegynder
14. november 2004 - 16:35 #19
Mit output kommer til at se sådan ud?
Hvordan får man det på en linie?

4                 
002               
0.                 
25
               

                 
4                 
0020               
.18               

                 
4                 
002               
0.1               
8
                 

                 
4                 
00                 
20.18
Avatar billede mortendalby Nybegynder
14. november 2004 - 16:38 #20
der kommer også nogle firkanter, men de er vist ikke kommmet med i ovenstående
Avatar billede arne_v Ekspert
14. november 2004 - 16:49 #21
Der er vel linie skift i de data du læser !?

Prøv evt.

pw.println((new String(readBuffer)).replaceAll("\r\n","").replaceAll("\n",""));
Avatar billede mortendalby Nybegynder
14. november 2004 - 16:59 #22
det hjalp desværre ikke. Der er ikke rigtig noget mønster i måden det bliver skrevet ud på
Avatar billede arne_v Ekspert
14. november 2004 - 22:33 #23
Kender du formatet på det input du får ind ?
Avatar billede mortendalby Nybegynder
15. november 2004 - 09:49 #24
Det er ASCII tekst
når jeg sætter den op mod hyperterminal ser dataene sådan ud:
4 0023.45
Avatar billede arne_v Ekspert
15. november 2004 - 10:40 #25
Har du prøvet:

pw.print(new String(readBuffer));

?
Avatar billede mortendalby Nybegynder
15. november 2004 - 15:08 #26
Så kommer det på en linie med store mellemrum. Jeg har prøvet at ændre på byte størrelsen (byte[] readBuffer = new byte[20];), men uden at det har hjulpet det helt store.

data i filen:
4                  00                  23.                81
Avatar billede mortendalby Nybegynder
15. november 2004 - 15:11 #27
efter de 81 er der også 2 firkanter, men kan ikke sætte dem ind her
Avatar billede arne_v Ekspert
15. november 2004 - 20:22 #28
Kunne du prøve at dumpe de bytes du læser og poste dem her
Avatar billede _carsten Nybegynder
15. november 2004 - 20:47 #29
De firkanter kunne være en såkaldt null byte

Prøv: pw.println((new String(readBuffer)).replaceAll("\r\n","").replaceAll("\0","");

eller copy/paste nedenstående:
      pw.println((new String(readBuffer)).replaceAll("\r\n","").replaceAll("",""));
Avatar billede mortendalby Nybegynder
15. november 2004 - 21:56 #30
Hej Carsten
Det hjalp desværre ikke når det bliver skrevet til filen, men når jeg skriver ud til skærmen fungere det! underligt

Arne:
hvad er det for nogle bytes du mener? Indholdet af filen eller hvad?
Avatar billede arne_v Ekspert
15. november 2004 - 21:58 #31
for(int i=0;i<readBuffer.length;i++) {
    System.out.println(readBuffer[i]);
}

eller noget i den stil
Avatar billede _carsten Nybegynder
15. november 2004 - 22:20 #32
Hvad så med:
pw.println((new String(readBuffer)).replaceAll("\r\n","").replaceAll("\0","").replaceAll(" ","");
Avatar billede mortendalby Nybegynder
15. november 2004 - 22:35 #33
Carsten: Der virker desværre ikke :-(

Arne: her er et stykke af det der kommer ud!
48
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
48
51
54
46
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
48
54
10
Avatar billede arne_v Ekspert
15. november 2004 - 22:38 #34
Så burde det som carsten allerede har foreslået virke:

pw.println((new String(readBuffer)).replaceAll("\u0000","");
Avatar billede _carsten Nybegynder
15. november 2004 - 22:41 #35
Hmm - der her virker hos mig

byte[] b = {(byte)'\0'};
String s =  new String(b);

pw.println((new String(readBuffer)).replaceAll("\r\n","").replaceAll("\0","").replaceAll( s ,"");
Avatar billede _carsten Nybegynder
15. november 2004 - 22:47 #36
Sludrepot, jeg bliver ved med mit ctrl + v

pw.println((new String(readBuffer)).replaceAll("\r\n","").replaceAll( s ,"");
Avatar billede mortendalby Nybegynder
15. november 2004 - 23:03 #37
ja, jeg kan ikke rigtig forstå det.

Her er det nederste stykke kode som jeg har rettet i. Kan i se om jeg evt. har sat noget forkert ind?
            byte[] readBuffer = new byte[20];
           
            try {
                while (inputStream.available() > 0) {
                    int numBytes = inputStream.read(readBuffer);
                                 
              }
                //System.out.print(new String(readBuffer));
                PrintWriter pw = new PrintWriter(new FileWriter(new File("C:\\temp.txt"), true));
                pw.print(new String(readBuffer));
                byte[] b = {(byte)'\0'};
                String s =  new String(b);
                pw.println((new String(readBuffer)).replaceAll("\r\n","").replaceAll("\0","").replaceAll( s ,""));
                pw.close();
                               

            } catch (IOException e) {}
            break;
        }
    }
}
Avatar billede _carsten Nybegynder
15. november 2004 - 23:07 #38
Ja

  pw.print(new String(readBuffer));  // fjern denne linie og se hvad det gir
Avatar billede mortendalby Nybegynder
15. november 2004 - 23:13 #39
så der outputtet sådan ud:

4
003
4.
93


4
0034
.9
3


4
00
34
.93
Avatar billede _carsten Nybegynder
15. november 2004 - 23:18 #40
Ret:    pw.println((new String(readBuffer)).replaceAll("\r\n","").replaceAll("\0","").replaceAll( s ,""));

Til:  pw.println((new String(readBuffer)).replaceAll("\r\n").replaceAll( s ,""));


Iøvrigt ville jeg bruge Arnes:
  pw.println((new String(readBuffer)).replaceAll("\u0000","");

Den er kortere, nemmere, mere overskuelig og resultatet er det samme


Egentlig er "pw.print(new String(readBuffer));" jo ikke en direkte fejl, så længe du husker at kigge efer resultatet i slutningen af filen
Avatar billede mortendalby Nybegynder
15. november 2004 - 23:27 #41
Jeg tror sku snart jeg opgiver det her. Jeg får det samme output som før.
Avatar billede _carsten Nybegynder
15. november 2004 - 23:34 #42
Hmm - jeg er gået kold for i dag, har ikke flere ideer!
Avatar billede mortendalby Nybegynder
15. november 2004 - 23:40 #43
det er vel også ved at være sengetid :-)
Avatar billede mortendalby Nybegynder
16. november 2004 - 21:14 #44
Hej igen.
Så har jeg haft en gut til at kigge lidt på koden, og han fik det til at virke.
Jeg har været utrolig taknemlig for al den tid du har brugt på det Arne :-)

Jeg har lige et sidste spørgsmål. Hvordan får man den til at overskrive den "gamle" temperatur i filen. Hvis den bare bliver ved med at skrive til filen kommer den hurtigt til at fylde en del.

Her er lige det der blev rettet:
public void serialEvent(SerialPortEvent event) {
        switch(event.getEventType()) {
        case SerialPortEvent.BI:
        case SerialPortEvent.OE:
        case SerialPortEvent.FE:
        case SerialPortEvent.PE:
        case SerialPortEvent.CD:
        case SerialPortEvent.CTS:
        case SerialPortEvent.DSR:
        case SerialPortEvent.RI:
        case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
            break;
        case SerialPortEvent.DATA_AVAILABLE:
            StringBuffer readBuffer = new StringBuffer();
            int c;
           
            try {
                while ((c=inputStream.read()) !=10) {
                    if(c!=13) readBuffer.append((char) c);
                                 
              }
                //System.out.print(new String(readBuffer));
                PrintWriter pw = new PrintWriter(new FileWriter(new File("C:\\temp.txt"), true));
                String s1 = new String(readBuffer).toString();
                String s2 = new String(s1.replaceAll("4 00",""));
                pw.println(new String(s2));
                //System.out.println(s2 + " grader");
                //pw.println((new String(readBuffer)).replaceAll("\r\n","").replaceAll( s ,""));
                pw.close();
                               

            } catch (IOException e) {}
            break;
        }
    }
}

Arne kan du ikke lige skrive et svar, så jeg kan give dig point
Avatar billede arne_v Ekspert
16. november 2004 - 21:18 #45
Hvis du fjerner det sidste true i den her linie:

PrintWriter pw = new PrintWriter(new FileWriter(new File("C:\\temp.txt"), true));

så starter den forfra i filen.
Avatar billede arne_v Ekspert
16. november 2004 - 21:18 #46
og et svar
Avatar billede mortendalby Nybegynder
16. november 2004 - 21:28 #47
Endnu engang tal for hjælpen
Avatar billede mortendalby Nybegynder
16. november 2004 - 21:30 #48
hey...... har du fået pointene?
synes ikke lige at det sådan ud
Avatar billede arne_v Ekspert
16. november 2004 - 21:39 #49
Du skal markere navnet så det bliver blåt inden du klikker accepter
Avatar billede mortendalby Nybegynder
16. november 2004 - 22:10 #50
Fint!
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