4

My ultimate goal is to receive lat and long GPS info from an Adafruit Ultimate GPS (NMEA 0183 standard) to my Java app. I am using the Java Marine API to do this. Current location will then be written to a DB along with timestamp.

So far I have successfully (I think) configured RXTX to enable coms over the USB port. The Java Marine API comes with some example .java files. The example below should scan through all existing COM ports and seek NMEA data - but when I run it I just get the output

Scanning port /dev/tty.Bluetooth-Incoming-Port

The GPS is connected, and when I access it via Terminal I can see it streaming data.

Please forgive this text dump, I am a little out of my depth and am unsure what parts are of relevance.

public class SerialPortExample implements SentenceListener {

public SerialPortExample() {
    init();}

public void readingPaused() {
    System.out.println("-- Paused --");}

public void readingStarted() {
    System.out.println("-- Started --");}

public void readingStopped() {
    System.out.println("-- Stopped --");}

public void sentenceRead(SentenceEvent event) {
    // here we receive each sentence read from the port
    System.out.println(event.getSentence());}

private SerialPort getSerialPort() {
    try {
        Enumeration<?> e = CommPortIdentifier.getPortIdentifiers();

        while (e.hasMoreElements()) {
            CommPortIdentifier id = (CommPortIdentifier) e.nextElement();
            if (id.getPortType() == CommPortIdentifier.PORT_SERIAL) {
                SerialPort sp = (SerialPort) id.open("SerialExample", 30);
                sp.setSerialPortParams(4800, SerialPort.DATABITS_8,
                        SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
                InputStream is = sp.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader buf = new BufferedReader(isr);

                System.out.println("Scanning port " + sp.getName());

                // try each port few times before giving up
                for (int i = 0; i < 5; i++) {
                    try {
                        String data = buf.readLine();
                        if (SentenceValidator.isValid(data)) {
                            System.out.println("NMEA data found!");
                            return sp;}
                    } catch (Exception ex) {
                        ex.printStackTrace();}}
                is.close();
                isr.close();
                buf.close();}
        }
        System.out.println("NMEA data was not found..");
    } catch (Exception e) {
        e.printStackTrace();}
    return null;}
private void init() {
    try {SerialPort sp = getSerialPort();
        if (sp != null) {
            InputStream is = sp.getInputStream();
            SentenceReader sr = new SentenceReader(is);
            sr.addSentenceListener(this);
            sr.start(); }

    } catch (IOException e) {
        e.printStackTrace();}}

public static void main(String[] args) {
    new SerialPortExample();}}

So I think it's stuck looking at the tty.Bluetooth-Incoming-Port? How might I get it to look at the tty.usbserial port?

With thanks

Ben Mayo
  • 1,285
  • 2
  • 20
  • 37

1 Answers1

6

you're close to get connected ^^

when you scan your system for com-ports, just print them out!

while (e.hasMoreElements()) {
    CommPortIdentifier id = (CommPortIdentifier) e.nextElement();
    if(serialPortId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
        System.out.println(serialPortId.getName());//print the serial port name
    }
}

your output should be something like

Native lib Version = RXTX-2.1-7
Java lib Version = RXTX-2.1-7
/dev/ttyS1
/dev/ttyS0

now that you know the name of the serial port you can use this information to open that port! Let's say your GPS is connected to serial port ttyS1...

go again into your code and adapt it like this:

enumComm = CommPortIdentifier.getPortIdentifiers();
while(enumComm.hasMoreElements()) {
    serialPortId = (CommPortIdentifier) enumComm.nextElement();
    if (serialPortId.getName().equalsIgnoreCase("/dev/ttyS1")) { //HERE you get your serial port

        try {
            SerialPort sp = (SerialPort) id.open("SerialExample", 30);
            //continue with your code here
        } catch (PortInUseException e) {
            System.out.println("port in use");
        }
    }
}

this only works because your usb-device creates a virtual serial port! Serial port schematics

Martin Frank
  • 3,445
  • 1
  • 27
  • 47
  • i guess YOUR serial port should have the name dev/tty.usbserial but it will be only found if you plug that GPS in - because within the USB-Connector there should be a small USB<-->RS232 transformer, and once you plug it in your usb-connector acts like a is a serial port – Martin Frank Jan 31 '14 at 05:24
  • Perfect, thank you Martin for your invaluable support. Output is now: `Stable Library Native lib Version = RXTX-2.1-7 Java lib Version = RXTX-2.1-7 /dev/tty.usbserial Scanning port /dev/tty.usbserial` – Ben Mayo Jan 31 '14 at 09:48
  • And setting the baud rate to the correct value (9600) results in a steady stream of NMEA data. Excellent! – Ben Mayo Jan 31 '14 at 10:06
  • well i'm glad i could provide a little help!!! now with working gps you certainly will find your way around!!! – Martin Frank Jan 31 '14 at 10:18