Daten in JfreeChart darstellen

swit27

Mitglied
Hallo Leute;

ich habe eine Klasse geschrieben, die einen Befehl zu einem "Messgerät" sendet, und bekommt Antwort.
Das Problem ist das die Daten die ich bekomme werden nicht im chart gezeichnet.

Java Code:


Code:
import javax.comm.CommPortIdentifier;
import javax.comm.SerialPort;
import javax.comm.SerialPortEvent;
import javax.comm.SerialPortEventListener;
import javax.comm.UnsupportedCommOperationException;
import javax.swing.JButton;
import javax.swing.JPanel;


import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.XYSeries;
import org.jfree.data.XYSeriesCollection;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;


import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;

import java.awt.*;
import java.awt.event.*;

public class TempBefehl extends ApplicationFrame implements ActionListener
{
	static CommPortIdentifier portID; 
     
    static SerialPort serialport; 
  
    static InputStream ins; 
    static OutputStream out;
    static double temp = 0;
    static double winkel = 0;
   
   
    static PrintWriter aus ;
    String nachricht= null;
  
    final JButton button1 = new JButton("Add To Series 1");
   
    final static XYSeries series = new XYSeries("");  
	final static  XYSeriesCollection dataset = new XYSeriesCollection(series);
    
    public TempBefehl(String title)//(String port, String title)	
    {
    	
    	super(title);
    	
    	try
        {
        // erzeugt ein CommPortIdentfier-Objekt, hier heisst es portID 
        portID = CommPortIdentifier.getPortIdentifier("COM1"); 
        // öffne den port COM1 
        serialport = (SerialPort) portID.open("COM1", 5000);
        }
        catch (Exception exc) 
        { 
            System.out.println("Fehler :" + exc); 
        }
        try 
        { 
                // InputStream 
                ins = serialport.getInputStream(); 
                // OutputStream 
                out = serialport.getOutputStream(); 
                serialport.addEventListener(new commListener());
           
        } 
        catch (Exception e) 
        { 
                System.out.println("Fehler: " + e); 
        } 

        serialport.notifyOnDataAvailable(true); 
        try 
        { 
                // Hier werden die Parameter festgelegt 
                serialport.setSerialPortParams(115200, SerialPort.DATABITS_8, 
                                SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); 
        } 
        catch (UnsupportedCommOperationException e)
        { 
        } 
    	
    	
    	
		    	final JFreeChart chart = ChartFactory.createXYLineChart(
			 			"Diagramm",
			            "Winkel", 
			            "Temperatur",
			            dataset,
			            PlotOrientation.VERTICAL, 
			            true,
			            true,
			            false);
	    	
		 	final ChartPanel chartPanel = new ChartPanel(chart);
		 	chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
		 	chartPanel.setMouseZoomable(true, false);
		 	setContentPane(chartPanel);
		 	
		 	 final XYPlot plot = chart.getXYPlot();
		 	
	        plot.setBackgroundPaint(Color.lightGray);
	        plot.setDomainGridlinePaint(Color.white);
	        plot.setRangeGridlinePaint(Color.white);
		 
	        
	        final ValueAxis axis = plot.getDomainAxis();
	        axis.setAutoRange(true);// x axe wird gefüllt 
	        axis.setRange(0,90);
	        
	       final NumberAxis rangeAxis2 = (NumberAxis) plot.getRangeAxis();
	       // rangeAxis2.setAutoRangeIncludesZero(false);
	        rangeAxis2.setRange(0,200);
	        
	        final JPanel content = new JPanel(new BorderLayout());
	        content.add(chartPanel);
	        
	        content.add(chartPanel);
	        button1.setActionCommand("ADD_DATA_1");
	        //button1.addActionListener(this);
	        
	        final JPanel buttonPanel = new JPanel(new FlowLayout());
	        buttonPanel.add(button1);
	        
	        content.add(buttonPanel, BorderLayout.SOUTH);
	        chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
	        setContentPane(content);
	        
	        button1.addActionListener(this);
	        		
    }
    
   // public class sendeListener implements ActionListener 
    //{ 
        public void actionPerformed(ActionEvent e)
    	
        {
        	Object source = e.getSource();
        	
				        	               
				        			                  
				        				
					        	while(true)
					        	{
					        		int x = 0X02;
							    		char stx = (char)x;
							    	
							    		//System.out.println(stx);
							    		
										aus = new PrintWriter(out); 
								        aus.println(stx); 
								        aus.flush(); 
								        aus.close();
					        		
							    	try
					    			{
					    				
					    				Thread.sleep(1000);//1000 millisekunde = 1 sekunde
					    				
					    			}
					    			catch(InterruptedException ex)
					    			{
					    				ex.printStackTrace();
					    				//close();
					    			}
					        	}
			
        }
    	

    public class commListener implements SerialPortEventListener 
    { 
    	
            public void serialEvent(SerialPortEvent event) 
            { 
            	 
                    if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) 
                    { 
                    	
                            byte[] readBuffer = new byte[256]; 
                            try 
                            { 
                            	
                            	//while (ins.available() > 0)
                            	if (ins.read(readBuffer)!= readBuffer.length)
                                { 
                                  int numBytes = ins.read(readBuffer);
                                    
                                    
                          
                            	
                                  	byte zeichen;
                            	
                            	
	                            	
	                                  for (int i=2 ;i<readBuffer.length; i++)
	                                  {
	                                	
	                                	  zeichen = (readBuffer[i]);
	                                
	                                
	                                	  	winkel = (255/255.0)*(i-2);
	                                		temp = byteToInt(zeichen)/255.0 * (200-100) + 100;
	                                 		
	                                 		
	                                 		System.out.println(winkel+"   "+temp+"\n");
	                                 		
	                                 		
	                                 		
	                                 			series.add(winkel,temp);
	                                 		
	                                   }
                         		
	                            
	                                  
	                                 series.clear();
	                          
                                	}
                            	}
	                            catch (IOException e) 
	                            { 
	                                    System.out.println("Fehler: " + e);
	                                   //close();
	                                   
	                            } 
	                           
                            }
                          
                    }
                    
                   
            }
           
    
    
    
    public static int byteToInt(byte b)
    {
    	return  (b & 0x00ff);
    }
   
    public void close()
    {
	    try
			{
				ins.close();
				out.close();
				
			}
			catch (IOException e)
			{}
			serialport.close();
    }
    public static void zeichnen()
	{
		TempBefehl demo = new TempBefehl(""); 
        demo.pack(); 
        RefineryUtilities.centerFrameOnScreen(demo); 
        demo.setVisible(true);
	}
}

Danke im voraus

Gruß
 

Anhänge

Hallo,

ich bitte nochmal um einen Tipp, es geht nicht um meine Aufgabe zu Lösen, es geht nur um einen Tipp.

Danke im voraus.
 
In deinem Post die Tags [ CODE] und [ /CODE] (ohne die Leerzeichen innerhalb der Kalmmern) um den von dir geposteten COde setzen. Das sieht dann so aus:

Code:
public void ichBinEinBeispiel(String test) {
  System.out.println("Tolles Beispiel! ;)");
}

Alternativ gehen auch die [ JAVA] ... [ /JAVA] Tags. Formatiert den Code auch noch hübsch, gibt dann aber Probleme beim copy & paste, da die Zeilennummern dabei sind.

Java:
public void ichBinEinBeispiel(String test) {
  System.out.println("Tolles Beispiel! ;)");
}
 
Ach so Ok, ich bin neu hier deswegen :-)

dann mal probieren :

Code:
import javax.comm.CommPortIdentifier;
import javax.comm.SerialPort;
import javax.comm.SerialPortEvent;
import javax.comm.SerialPortEventListener;
import javax.comm.UnsupportedCommOperationException;
import javax.swing.JButton;
import javax.swing.JPanel;


import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.XYSeries;
import org.jfree.data.XYSeriesCollection;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;


import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;

import java.awt.*;
import java.awt.event.*;

public class TempBefehl extends ApplicationFrame implements ActionListener
{
	static CommPortIdentifier portID; 
     
    static SerialPort serialport; 
  
    static InputStream ins; 
    static OutputStream out;
    static double temp = 0;
    static double winkel = 0;
   
   
    static PrintWriter aus ;
    String nachricht= null;
  
    final JButton button1 = new JButton("Add To Series 1");
   
    final static XYSeries series = new XYSeries("");  
	final static  XYSeriesCollection dataset = new XYSeriesCollection(series);
    
    public TempBefehl(String title)//(String port, String title)	
    {
    	
    	super(title);
    	
    	try
        {
        // erzeugt ein CommPortIdentfier-Objekt, hier heisst es portID 
        portID = CommPortIdentifier.getPortIdentifier("COM1"); 
        // öffne den port COM1 
        serialport = (SerialPort) portID.open("COM1", 5000);
        }
        catch (Exception exc) 
        { 
            System.out.println("Fehler :" + exc); 
        }
        try 
        { 
                // InputStream 
                ins = serialport.getInputStream(); 
                // OutputStream 
                out = serialport.getOutputStream(); 
                serialport.addEventListener(new commListener());
           
        } 
        catch (Exception e) 
        { 
                System.out.println("Fehler: " + e); 
        } 

        serialport.notifyOnDataAvailable(true); 
        try 
        { 
                // Hier werden die Parameter festgelegt 
                serialport.setSerialPortParams(115200, SerialPort.DATABITS_8, 
                                SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); 
        } 
        catch (UnsupportedCommOperationException e)
        { 
        } 
    	
    	
    	
		    	final JFreeChart chart = ChartFactory.createXYLineChart(
			 			"Diagramm",
			            "Winkel", 
			            "Temperatur",
			            dataset,
			            PlotOrientation.VERTICAL, 
			            true,
			            true,
			            false);
	    	
		 	final ChartPanel chartPanel = new ChartPanel(chart);
		 	chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
		 	chartPanel.setMouseZoomable(true, false);
		 	setContentPane(chartPanel);
		 	
		 	 final XYPlot plot = chart.getXYPlot();
		 	
	        plot.setBackgroundPaint(Color.lightGray);
	        plot.setDomainGridlinePaint(Color.white);
	        plot.setRangeGridlinePaint(Color.white);
		 
	        
	        final ValueAxis axis = plot.getDomainAxis();
	        axis.setAutoRange(true);// x axe wird gefüllt 
	        axis.setRange(0,90);
	        
	       final NumberAxis rangeAxis2 = (NumberAxis) plot.getRangeAxis();
	       // rangeAxis2.setAutoRangeIncludesZero(false);
	        rangeAxis2.setRange(0,200);
	        
	        final JPanel content = new JPanel(new BorderLayout());
	        content.add(chartPanel);
	        
	        content.add(chartPanel);
	        button1.setActionCommand("ADD_DATA_1");
	        //button1.addActionListener(this);
	        
	        final JPanel buttonPanel = new JPanel(new FlowLayout());
	        buttonPanel.add(button1);
	        
	        content.add(buttonPanel, BorderLayout.SOUTH);
	        chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
	        setContentPane(content);
	        
	        button1.addActionListener(this);
	        		
    }
    
   // public class sendeListener implements ActionListener 
    //{ 
        public void actionPerformed(ActionEvent e)
    	
        {
        	Object source = e.getSource();
        	
				        	               
				        			                  
				        				
					        	while(true)
					        	{
					        		int x = 0X02;
							    		char stx = (char)x;
							    	
							    		//System.out.println(stx);
							    		
										aus = new PrintWriter(out); 
								        aus.println(stx); 
								        aus.flush(); 
								        aus.close();
					        		
							    	try
					    			{
					    				
					    				Thread.sleep(1000);//1000 millisekunde = 1 sekunde
					    				
					    			}
					    			catch(InterruptedException ex)
					    			{
					    				ex.printStackTrace();
					    				//close();
					    			}
					        	}
			
        }
    	

    public class commListener implements SerialPortEventListener 
    { 
    	
            public void serialEvent(SerialPortEvent event) 
            { 
            	 
                    if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) 
                    { 
                    	
                            byte[] readBuffer = new byte[256]; 
                            try 
                            { 
                            	
                            	//while (ins.available() > 0)
                            	if (ins.read(readBuffer)!= readBuffer.length)
                                { 
                                  int numBytes = ins.read(readBuffer);
                                    
                                    
                          
                            	
                                  	byte zeichen;
                            	
                            	
	                            	
	                                  for (int i=2 ;i<readBuffer.length; i++)
	                                  {
	                                	
	                                	  zeichen = (readBuffer[i]);
	                                
	                                
	                                	  	winkel = (255/255.0)*(i-2);
	                                		temp = byteToInt(zeichen)/255.0 * (200-100) + 100;
	                                 		
	                                 		
	                                 		System.out.println(winkel+"   "+temp+"\n");
	                                 		
	                                 		
	                                 		
	                                 			series.add(winkel,temp);
	                                 		
	                                   }
                         		
	                            
	                                  
	                                 series.clear();
	                          
                                	}
                            	}
	                            catch (IOException e) 
	                            { 
	                                    System.out.println("Fehler: " + e);
	                                   //close();
	                                   
	                            } 
	                           
                            }
                          
                    }
                    
                   
            }
           
    
    
    
    public static int byteToInt(byte b)
    {
    	return  (b & 0x00ff);
    }
   
    public void close()
    {
	    try
			{
				ins.close();
				out.close();
				
			}
			catch (IOException e)
			{}
			serialport.close();
    }
    public static void zeichnen()
	{
		TempBefehl demo = new TempBefehl(""); 
        demo.pack(); 
        RefineryUtilities.centerFrameOnScreen(demo); 
        demo.setVisible(true);
	}
}

dann sehen wir ob es klappen wird :-)
 
Mein Problem ist, wenn ich einen Befehl ("stx") zu einem Messgerät sende, kriege ich Antwort, diese Antwort wird in diesem Jfreechat dargestellt. Das Funktioniert ohne Problem.
Aber wenn ich mit Thread diese Befehl jede 1s sende, werden die Daten nicht dargestellt und bleit das chart leer. Obwoh die Daten gesendet werden.
 
Zurück