-3

Please let me know that scanner is not working properly it is missing data from serial port. Is there any other method to obtain values from serial port from Arduino? I am using Accelerometer ADXL335 and Arduino sending 3-axes values, I want to attain on my Java program. If anyone please guide me how to resolve it.

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Stroke;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.Serializable;
import java.util.Random;
import java.util.Scanner;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.Timer;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.data.time.DynamicTimeSeriesCollection;
import org.jfree.data.time.Second;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.ApplicationFrame;

import com.fazecast.jSerialComm.SerialPort;
import com.fazecast.jSerialComm.SerialPortDataListener;

public class Grid_Layout extends ApplicationFrame {

    /**
    * 
    */
    private static final long serialVersionUID = 1L;
    private static final int CHART_WIDTH = 600;
    private static final int CHART_HEIGHT = 300;
    private static final String TITLE1 = "X-Axis";
    private static final String TITLE2 = "Y-Axis";
    private static final String TITLE3 = "Z-Axis";
    private static final String START = "Start";
    private static final String STOP = "Stop";
    private static final float MINMAX = 200;
    private static final int COUNT = 2 * 60;
    private static final int FAST = 100;
    private static final int SLOW = FAST * 5;
    private static final Random random = new Random();
    private static final JComboBox<String> portList = new JComboBox<String>();
    private static final JButton connect = new JButton("Connect");
    private static final TextField text = new TextField(10);
    private Timer timer;
    private Timer timer2;
    private Timer timer3;
    private static SerialPort chosenPort;
    private static int x = 0;
    private static float number;

    private static class GridChart extends ChartPanel {

        /**
         * 
         */
        private static final long serialVersionUID = 1L;

        public GridChart(JFreeChart chart) {
            super(chart);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(CHART_WIDTH, CHART_HEIGHT);
        }
    }

    public Grid_Layout(final String title) {
        super(title);

        final XYDataset dataset = createDataset1();
        JFreeChart chart = createChart(dataset);

        final XYDataset dataset2 = createDataset2();
        JFreeChart chart2 = createChart2(dataset2);

        final XYDataset dataset3 = createDataset3();
        JFreeChart chart3 = createChart3(dataset3);

        final JButton run = new JButton(STOP);
        run.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String cmd = e.getActionCommand();
                if (STOP.equals(cmd)) {
                    timer.stop();
                    timer2.stop();
                    timer3.stop();
                    run.setText(START);
                } else {
                    timer.start();
                    timer2.start();
                    timer3.start();
                    run.setText(STOP);
                }
            }
        });

        final JComboBox<String> combo = new JComboBox<String>();
        combo.addItem("Fast");
        combo.addItem("Slow");
        combo.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if ("Fast".equals(combo.getSelectedItem())) {
                    timer.setDelay(FAST);
                    timer2.setDelay(FAST);
                    timer3.setDelay(FAST);
                } else {
                    timer.setDelay(SLOW);
                    timer2.setDelay(SLOW);
                    timer3.setDelay(SLOW);
                }
            }
        });

        // populate the drop-down box
        SerialPort[] portNames = SerialPort.getCommPorts();
        for (int i = 0; i < portNames.length; i++)
            portList.addItem(portNames[i].getSystemPortName());

        connect.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                if (connect.getText().equals("Connect")) {
                    // attempt to connect to the serial port
                    chosenPort = SerialPort.getCommPort(portList.getSelectedItem().toString());
                    chosenPort.setComPortTimeouts(SerialPort.TIMEOUT_SCANNER, 0, 0);
                    if (chosenPort.openPort()) {
                        connect.setText("Disconnect");
                        portList.setEnabled(false);
                    }
                            randomValue();

                } else {
                    // disconnect from the serial port
                    chosenPort.closePort();
                    portList.setEnabled(true);
                    connect.setText("Connect");
                    text.setText(null);
                    // series.clear();
                    x = 0;

                }

            }

        });

        JPanel gridPanel = new JPanel(new GridLayout(2, 2));
        gridPanel.add(new GridChart(chart));
        gridPanel.add(new GridChart(chart2));
        gridPanel.add(new GridChart(chart3));

        JPanel btnPanel = new JPanel(new FlowLayout());
        btnPanel.add(run);
        btnPanel.add(combo);
        btnPanel.add(portList);
        btnPanel.add(connect);
        btnPanel.add(text);
        this.add(gridPanel);
        this.add(btnPanel, BorderLayout.SOUTH);
    }

    private float randomValue() {
        // create a new thread that listens for incoming text and populates the graph
        Thread thread = new Thread() {

            @Override
            public void run() {
                try {
                    Scanner scanner = new Scanner(chosenPort.getInputStream());

                    while (scanner.hasNextByte()) {
                        try {
                            
                            String line = scanner.nextLine();                                               
                        //  number = Integer.parseInt(line); 
                            System.out.println(line);
                            //text.setText(String.valueOf(number));                     
                        } catch (Exception e) {
                            System.out.println(e);
                        }
                    }
                    scanner.close();
                } catch (NullPointerException e) {
                }
            }
        };
        thread.start();
        
        return number;

    }

    private float[] gaussianData() {
        float[] a = new float[COUNT];
        for (int i = 0; i < a.length; i++) {
            a[i] = randomValue();
        }
        return a;
    }

    private JFreeChart createChart(final XYDataset dataset) {
        final JFreeChart result = ChartFactory.createTimeSeriesChart(TITLE1, "Time (seconds)", "Intensity (cm/s)",
                dataset, true, true, false);

        final XYPlot plot = result.getXYPlot();
        ValueAxis domain = plot.getDomainAxis();
        domain.setAutoRange(true);

        ValueAxis range = plot.getRangeAxis();
      //range.setRange(-MINMAX, MINMAX);
        range.setAutoRange(true);
        XYItemRenderer render = plot.getRenderer();
        render.setSeriesPaint(0, Color.blue);
        return result;
    }

    private JFreeChart createChart2(final XYDataset dataset) {
        final JFreeChart result = ChartFactory.createTimeSeriesChart(TITLE2, "Time (seconds)", "Intensity (cm/s)",
                dataset, true, true, false);

        final XYPlot plot = result.getXYPlot();
        ValueAxis domain = plot.getDomainAxis();
        domain.setAutoRange(true);

        ValueAxis range = plot.getRangeAxis();
        //range.setRange(-MINMAX, MINMAX);
        range.setAutoRange(true);
        XYItemRenderer render = plot.getRenderer();
        render.setSeriesPaint(0, Color.red);
        return result;
    }

    private JFreeChart createChart3(final XYDataset dataset) {
        final JFreeChart result = ChartFactory.createTimeSeriesChart(TITLE3, "Time (seconds)", "Intensity (cm/s)",
                dataset, true, true, false);

        final XYPlot plot = result.getXYPlot();
        ValueAxis domain = plot.getDomainAxis();
        domain.setAutoRange(true);

        ValueAxis range = plot.getRangeAxis();
        //range.setRange(-MINMAX, MINMAX);
        range.setAutoRange(true);
        XYItemRenderer render = plot.getRenderer();
        render.setSeriesPaint(0, Color.black);
        return result;
    }

    public void start() {
        timer.start();
        timer2.start();
        timer3.start();
    }

    private XYDataset createDataset1() {
        final DynamicTimeSeriesCollection dataset = new DynamicTimeSeriesCollection(1, COUNT, new Second());
        dataset.setTimeBase(new Second(0, 0, 0, 24, 5, 2022));
        dataset.addSeries(gaussianData(), 0, "X");

        timer = new Timer(FAST, new ActionListener() {
            float[] newData = new float[1];

            @Override
            public void actionPerformed(ActionEvent e) {
                newData[0] = randomValue();
                dataset.advanceTime();
                dataset.appendData(newData);
            }
        });
        return dataset;
    }

    private XYDataset createDataset2() {
        final DynamicTimeSeriesCollection dataset = new DynamicTimeSeriesCollection(1, COUNT, new Second());
        dataset.setTimeBase(new Second(0, 0, 0, 26, 5, 2022));
        dataset.addSeries(gaussianData(), 0, "Y");
        timer2 = new Timer(FAST, new ActionListener() {
            float[] newData2 = new float[1];

            @Override
            public void actionPerformed(ActionEvent e) {
                newData2[0] = randomValue();
                dataset.advanceTime();
                dataset.appendData(newData2);
            }
        });
        return dataset;
    }

    private XYDataset createDataset3() {
        final DynamicTimeSeriesCollection dataset = new DynamicTimeSeriesCollection(1, COUNT, new Second());
        dataset.setTimeBase(new Second(0, 0, 0, 26, 5, 2022));
        dataset.addSeries(gaussianData(), 0, "Z");
        timer3 = new Timer(FAST, new ActionListener() {
            float[] newData3 = new float[1];

            @Override
            public void actionPerformed(ActionEvent e) {
                newData3[0] = randomValue();
                dataset.advanceTime();
                dataset.appendData(newData3);
            }
        });
        return dataset;
    }

    public static void main(final String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                Grid_Layout demo = new Grid_Layout("Vibration Analyser");
                //demo.setLayout(new GridLayout(2, 2, 20, 20));
                demo.pack();
                demo.setLocationRelativeTo(null);
                demo.setVisible(true);
                demo.start();

            }
        });

    }
}
trashgod
  • 200,320
  • 28
  • 229
  • 974
  • 3
    Please reduce your code to a [mcve]. – Ivar May 30 '22 at 11:58
  • 1
    I find that parsing of the output stream a little difficult to 'believe'. What specific details have you been given about the output? I find it unlikely that it would be spitting out text. What @trashgod is saying is also likely to be correct, but let's start with getting the output collection right – g00se May 30 '22 at 12:50

0 Answers0