1

I am trying to read GPS data from a serial port(ttyACM0) in java using jssc jar which I need to display as a label in a JavaFx application. I have a created a thread for reading the GPS data but this thread is consuming 100% CPU(checked using top command + Shift H) because of which my GUI is getting freezed. This is a sample code I have written for reading GPS data

Serial Interface

import jssc.*;


public class SerInterface {
    String portName;
    int baud;
    boolean lineMode;

    // The chosen Port itself
    SerialPort port;

    public byte[] recvBuff;


    public SerInterface(String portName, int baud, boolean lineMode) {
        this.portName = portName;
        this.baud = baud;
        this.lineMode = lineMode;

        recvBuff = new byte[8192];

        openPort();

        if((port == null) || (!port.isOpened()))
            System.out.println(portName + " not opened successfully");
    }


    void openPort() {
        port = new SerialPort(portName);
        if(port == null)
            return;

        try {
            port.openPort();
        } catch (SerialPortException e) {
            e.printStackTrace();
        }

        try {
            if(port.isOpened())
                port.setParams(SerialPort.BAUDRATE_9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
            else
                return;
        } catch (SerialPortException e) {
            e.printStackTrace();
        }

        System.out.println(portName + " opened successfully");
    }


    public int recvData() {
        int len = 0;
        if(port.isOpened()) {
            try {
                byte[] buff = port.readBytes();
                if((buff == null) || (buff.length == 0))
                    return 0;

                len = buff.length;
                if(len > recvBuff.length)
                    len = recvBuff.length;

                System.arraycopy(buff, 0, recvBuff, 0, len);
                buff = null;
            } catch (SerialPortException e) {
                e.printStackTrace();
            }
        }

        return len;
    }


    public void sendData(byte[] sendBuff, int len) {
        if(port.isOpened()) {
            try {
                port.writeBytes(sendBuff);
            } catch (SerialPortException e) {
                e.printStackTrace();
            }
        }
    }


    public boolean validatePort() {
        if(!port.isOpened()) {
            openPort();

            if(port.isOpened())
                return true;
            else
                return false;
        }
        else
            return true;
    }


    public void flushPort() {
        if(port.isOpened()) {
            try {
                port.purgePort(SerialPort.PURGE_RXCLEAR | SerialPort.PURGE_TXCLEAR);
            } catch (SerialPortException e) {
                e.printStackTrace();
            }
        }
    }


    public void closePort() {
        if(port.isOpened()) {
            try {
                port.closePort();
                System.out.println("port closed");
            } catch (SerialPortException e) {
                e.printStackTrace();
            }
        }
    }
}

GPSReceiver thread extends SerInterface and implements Runnable

@Override
public void run() {
    flushPort();
while(true) {
    if(!validatePort()) {
        try {
            sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        continue;
    }

    int dataLength = recvData();
    if(dataLength < 2)
        continue;

    try {
        InputStream gpsStream = new ByteArrayInputStream(recvBuff, 0, dataLength);
        BufferedReader br = new BufferedReader(new InputStreamReader(gpsStream, StandardCharsets.US_ASCII));

        while(true) {
            try {
                if (!((output = br.readLine()) != null)) break;
            } catch (IOException e) {
                e.printStackTrace();
            }

            extractData();
        }
    }
    catch(NullPointerException e) {
        e.printStackTrace();
    }
}

Main Thread

GPSInterface objGPSThreadInterface = new GPSInterface(GPSPortName, 9600, true);
GPSThreadInt = new Thread(objGPSThreadInterface, "GPSINT");

I am using jdk-13.0.1 and jssc-2.9.1 jar

Harry
  • 2,177
  • 1
  • 19
  • 33

0 Answers0