Java JSS C последовательное чтение, потребляющее 100% ЦП - PullRequest
1 голос
/ 13 марта 2020

Я пытаюсь прочитать данные GPS с последовательного порта (ttyACM0) в java, используя jss c jar, который мне нужно отобразить как метку в приложении JavaFx. Я создал поток для чтения данных GPS, но этот поток потребляет 100% ЦП (проверено с помощью команды top + Shift H), из-за чего мой GUI зависает. Это пример кода, который я написал для чтения данных GPS

Последовательный интерфейс

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 расширяет SerInterface и реализует 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();
    }
}

Основной поток

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

Я использую jdk-13.0.1 и jss c -2.9.1 jar

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...