Разделить строку из последовательного порта на Java - PullRequest
0 голосов
/ 23 июня 2019

У меня есть код Arduino, который отправляет миллис () и два показания от двух потенциометров, каждый из которых отправляется в новой строке, например так:

 Serial.println(millis());
 Serial.println(val1);
 Serial.println(val2);

Я хочу использовать Java для хранения каждого изэти строки в своей собственной переменной, поэтому я могу использовать JFreeChart для отображения данных и просмотра их в реальном времени, однако у меня возникают проблемы с размещением строк в отдельные переменные.

Я попытался изменить код arduino и использовать разбиение Stringметод в Java, но это не сработало.

вот часть моего кода, где я использую сканер для чтения последовательных данных:

Thread thread = new Thread() {
    @Override
    public void run() {
        Scanner scan = new Scanner(port.getInputStream());
        while(scan.hasNextLine()) {
            //where the data stuff is put into graph
        }
        scan.close();
    }
};

edit:

поэтому я попытался использовать метод разделения следующим образом:

Thread thread = new Thread() {
    @Override
    public void run() {
        String serialDat;

        Scanner scan = new Scanner(port.getInputStream());
        while(scan.hasNextLine()) {
            serialDat = scan.next();
            String[] dataValues = serialDat.split(",");
            System.out.println(dataValues[0] + " " + dataValues[1] + " " + dataValues[2]);

        }
        scan.close();
    }
};

Я заставил arduino отправлять данные следующим образом через Serial: millis (), sensor1, sensor2

но когда я использую код Java и подключаюсь к порту, я получаю

java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1

1 Ответ

1 голос
/ 23 июня 2019

Вы можете использовать массив строк, например String [], если количество входов известно заранее. Даже если он неизвестен, вы можете использовать List в качестве входных данных для этих строк.

package com.stackoverflow;

import com.google.common.base.Strings;

import java.io.File;
import java.io.FileInputStream;
import java.util.Scanner;
import java.util.logging.Logger;

public class StackOverflow_56719783 {

    public static void main(String[] args) throws Exception{
        final Logger logger = Logger.getLogger(StackOverflow_56719783.class.getSimpleName());

        //Use the port.getInputStream() instead of the file. I used file as you had given access to the
        //file in google drive present in the local machine.
        File inputFile = new File("XXXXX/inputfile.txt");
        //The FileInputStream is used in place of port.getInputStream() here.
        Scanner scan = new Scanner(new FileInputStream(inputFile));
        String serialData;
        //Use scan.hasNext() instead of scan.hasNextLine(). Please check the JavaDocs for
        //both these methods for the reason.
        while(scan.hasNext()) {
            serialData = scan.next();
            //Check if the current line is an empty line - Strings class is from google's guava library
            //https://github.com/google/guava/wiki/Release21
            if(Strings.isNullOrEmpty(serialData)) {
                continue;
            }

            //If current string does not contain the delimiter at all, we continue.
            if(!serialData.contains(",")) {
                logger.info("The input line does not contain the de-limiter ,");
                continue;
            }
            //Now we continue to split
            String[] dataValues = serialData.split(",");
            //If should be true that the length of the split array is greater than 0 and equal to 3.
            //Going by your input values, the first value looks like to be always an integer, second value is a double, third value is also a double.
            if(dataValues.length > 0 && dataValues.length == 3) {
                int millis = Integer.parseInt(dataValues[0]);
                double sensor1 = Double.parseDouble(dataValues[1]);
                double sensor2 = Double.parseDouble(dataValues[2]);
                System.out.println(millis + " "+ sensor1 + " "+sensor2);
            }
        }
        scan.close();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...