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.
Annonceindlæg fra Infor
13. november 2004 - 11:43
#2
Jeg har været ved at kigge på det, men jeg er ikke den store koder :-(
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; } } }
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();
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; } } }
13. november 2004 - 20:11
#6
filnavn skal siikert erstattes af et rigtigt filnavn
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
13. november 2004 - 20:36
#8
fejlbeskeden siger jo klart at variablen filnavn ikke eksisterer så ...
14. november 2004 - 11:41
#9
har du husket at have en endelse på dit filnavn, eks. nyfil.txt
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 :-(
14. november 2004 - 13:48
#11
Hvis du nu skriver: PrintWriter pw = new PrintWriter(new FileWriter(new File("C:\\foobar.txt"))); hvad så ?
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?
14. november 2004 - 15:04
#13
Jeg tror at du mener pw.println(new String(readBuffer));
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)
14. november 2004 - 15:20
#15
temperaturen bliver opdateret hver sekund fra temperaturmodulet
14. november 2004 - 15:36
#16
PrintWriter pw = new PrintWriter(new FileWriter(new File("C:\\foobar.txt", true)));
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
14. november 2004 - 15:55
#18
Sorry PrintWriter pw = new PrintWriter(new FileWriter(new File("C:\\foobar.txt"), true));
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
14. november 2004 - 16:38
#20
der kommer også nogle firkanter, men de er vist ikke kommmet med i ovenstående
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",""));
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å
14. november 2004 - 22:33
#23
Kender du formatet på det input du får ind ?
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
15. november 2004 - 10:40
#25
Har du prøvet: pw.print(new String(readBuffer)); ?
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
15. november 2004 - 15:11
#27
efter de 81 er der også 2 firkanter, men kan ikke sætte dem ind her
15. november 2004 - 20:22
#28
Kunne du prøve at dumpe de bytes du læser og poste dem her
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("",""));
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?
15. november 2004 - 21:58
#31
for(int i=0;i<readBuffer.length;i++) { System.out.println(readBuffer[i]); } eller noget i den stil
15. november 2004 - 22:20
#32
Hvad så med: pw.println((new String(readBuffer)).replaceAll("\r\n","").replaceAll("\0","").replaceAll(" ","");
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
15. november 2004 - 22:38
#34
Så burde det som carsten allerede har foreslået virke: pw.println((new String(readBuffer)).replaceAll("\u0000","");
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 ,"");
15. november 2004 - 22:47
#36
Sludrepot, jeg bliver ved med mit ctrl + v pw.println((new String(readBuffer)).replaceAll("\r\n","").replaceAll( s ,"");
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; } } }
15. november 2004 - 23:07
#38
Ja pw.print(new String(readBuffer)); // fjern denne linie og se hvad det gir
15. november 2004 - 23:13
#39
så der outputtet sådan ud: 4 003 4. 93 4 0034 .9 3 4 00 34 .93
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
15. november 2004 - 23:27
#41
Jeg tror sku snart jeg opgiver det her. Jeg får det samme output som før.
15. november 2004 - 23:34
#42
Hmm - jeg er gået kold for i dag, har ikke flere ideer!
15. november 2004 - 23:40
#43
det er vel også ved at være sengetid :-)
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
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.
16. november 2004 - 21:18
#46
og et svar
16. november 2004 - 21:28
#47
Endnu engang tal for hjælpen
16. november 2004 - 21:30
#48
hey...... har du fået pointene? synes ikke lige at det sådan ud
16. november 2004 - 21:39
#49
Du skal markere navnet så det bliver blåt inden du klikker accepter
16. november 2004 - 22:10
#50
Fint!
Kurser inden for grundlæggende programmering