|
Question : GPP Java Program
|
|
Hi people, i am a newbie in this things of Java. I have one program, which i pretend to modify, but first i need to know how it works. Well, i know what he does, but i dont know how is structured, like variables, classes etc etc etc. So, what i want is if someone can comment all the next code. To have and idea how to work it out after. Thanks a lot.
import java.io.*; import java.util.*; import javax.comm.*;
public class GpsReader implements SerialPortEventListener {
private InputStream inputStream; private SerialPort sPort;
private int bcount = 0;
static OutputStreamWriter outW = null; static CommPortIdentifier portId; static Enumeration portList;
public static final String FILENAME = "NMEA.txt"; public static final String PORTNAME = "COM5"; public static final int BAUDRATE = 4800; public static final int TIMEOUT = 2000;
public static void main(String[] args) {
GpsReader g = new GpsReader(); g.mymain(); }
void mymain(){
try { outW = new OutputStreamWriter( new FileOutputStream (FILENAME)); } catch (IOException e) { System.err.println("Ficheiro de escrita não aberto\n" + e.toString()); System.exit(1); }
portList = CommPortIdentifier.getPortIdentifiers();
while (portList.hasMoreElements()) { portId = (CommPortIdentifier) portList.nextElement(); if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { if (portId.getName().equals(PORTNAME)) {
try {sPort = (SerialPort) portId.open("GarApp", TIMEOUT);} catch (PortInUseException e) {}
try {inputStream = sPort.getInputStream();} catch (IOException e) {}
try {sPort.addEventListener(this);} catch (TooManyListenersException e) {}
sPort.notifyOnDataAvailable(true); try { sPort.setSerialPortParams(BAUDRATE, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); } catch (UnsupportedCommOperationException e) {} } } }
}
public void serialEvent(SerialPortEvent event) {
int newData = 0; char mybyte;
switch(event.getEventType()) { case SerialPortEvent.BI: case SerialPortEvent.OUTPUT_BUFFER_EMPTY: break;
case SerialPortEvent.DATA_AVAILABLE: while(newData != -1) { try { newData = inputStream.read(); if (newData == -1) {break;} mybyte = (char)newData; outW.write(mybyte); bcount = bcount + 1; if(mybyte == '$') {System.out.print("\r"+bcount+" bytes");} } catch(IOException ex) { System.err.println(ex); return; } } break; } } }
|
Answer : GPP Java Program
|
|
Here's the code with some comments and references to online documentation. Ask if you need specific info on some constructs. In order to really understand this, you'll have to read the documentation of the classes used. I would think that this code is still "work in progress"; it will do what's required but needs further work.
HTH, J
/* make names available, avoid full qualification: http://java.sun.com/docs/books/jls/second_edition/html/packages.doc.html#70209 */ import java.io.*; import java.util.*; import javax.comm.*;
/* class to copy GPS info from serial port into file */ public class GpsReader implements SerialPortEventListener {
private InputStream inputStream; /* http://java.sun.com/j2se/1.4.2/docs/api/java/io/InputStream.html */ private SerialPort sPort; /* http://java.sun.com/products/javacomm/javadocs/javax/comm/SerialPort.html */
private int bcount = 0; /* byte count */
static OutputStreamWriter outW = null; /* class to write an output file: http://java.sun.com/j2se/1.5.0/docs/api/java/io/OutputStreamWriter.html */ static CommPortIdentifier portId; /* which serial port to use: http://java.sun.com/products/javacomm/javadocs/javax/comm/CommPortIdentifier.html */ static Enumeration portList; /* list of all available serial ports */
public static final String FILENAME = "NMEA.txt"; // file to write output to; full path would be better public static final String PORTNAME = "COM5"; // which serial port to use; probably an USB serial device public static final int BAUDRATE = 4800; // baud rate - NMEA standard public static final int TIMEOUT = 2000; //
/* main program: Create a new GPSReader object and run its mymain method */ public static void main(String[] args) {
GpsReader g = new GpsReader(); g.mymain(); }
/* mymain method - main method of GPSReader class */ void mymain(){
/* create/open output file FILENAME = NMEA.TXT */ try { outW = new OutputStreamWriter( new FileOutputStream (FILENAME)); } /* if this fails, issue an error message and exit with error code 1 */ catch (IOException e) { System.err.println("Ficheiro de escrita não aberto\n" + e.toString()); System.exit(1); }
// find all available communication ports and copy them to port list */ portList = CommPortIdentifier.getPortIdentifiers();
// iterate through all ports and check whether it's a serial port while (portList.hasMoreElements()) { portId = (CommPortIdentifier) portList.nextElement(); // if it's a serial port, check whether it's the port specified as PORTNAME (COM5:) if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { if (portId.getName().equals(PORTNAME)) {
// yes, it's our port; try to open it and assign name "GarApp" try {sPort = (SerialPort) portId.open("GarApp", TIMEOUT);} // no further error handling catch (PortInUseException e) {}
// make the port available as stream to easy further processing try {inputStream = sPort.getInputStream();} catch (IOException e) {}
// assign an event handler - in this case, the SerialEvent method further down. // check http://java.sun.com/products/javacomm/javadocs/javax/comm/SerialPortEvent.html try {sPort.addEventListener(this);} catch (TooManyListenersException e) {}
// we're interested only if there's new data available sPort.notifyOnDataAvailable(true); /* a number of events is not handled, including error events and protocol handling events. This should really be done for production quality code. */
// set comm parameters try { sPort.setSerialPortParams(BAUDRATE, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); } catch (UnsupportedCommOperationException e) {} } } } // we're done initializing; the event handler will process all data coming from the serial port. }
/* process all serial port events. In this case, write the received data to the NMEA.TXT file. */ /* Check out http://java.sun.com/products/javacomm/javadocs/javax/comm/SerialPortEvent.html for all events */ public void serialEvent(SerialPortEvent event) {
int newData = 0; char mybyte;
/* a number of events is not handled, including error events and protocol handling events. This should really be done for production quality code. */
// we're not interested in BREAK signals or if the output buffer is empty. Code probably isn't necessary since these switch(event.getEventType()) { case SerialPortEvent.BI: case SerialPortEvent.OUTPUT_BUFFER_EMPTY: break;
// more interesting: if there's new data available case SerialPortEvent.DATA_AVAILABLE: // while there's more data avilable on the serial port while(newData != -1) {
// read one byte from the InputStream associated with the serial port try { newData = inputStream.read();
// stop if there's no more data if (newData == -1) {break;} // translate into a byte mybyte = (char)newData;
// write to file outW.write(mybyte);
bcount = bcount + 1;
// if the byte is a dollar sign, issue a progress message to the console; for debugging only if(mybyte == '$') {System.out.print("\r"+bcount+" bytes");}
// if something goes wrong, issue an error message and exit } catch(IOException ex) { System.err.println(ex); return; } } break; } } }
|
|
|
|