2010-01-17 42 views
0

基本上我的程序應該顯示其中一個面板根據「輸入」數據(整數值)從個人電腦上的串行連接來在屏幕上繪製的點的幀。SerialPortEventListener

的問題是:如何「轉移」的值從串口其他類幀並調用重繪()方法??????????

鑑於通過控制檯我正確地接收所有的數據通過UART,我用的方法是通過事件驅動...數據我得到的是好的......他們在控制檯被輸出,我得到正是我所期望的價值。但是,由於創建主框架類和子面板是另一個類,如何調用由事件驅動的程序,每次重畫法我收到一個數據????

下面是MainProgram(主程序)代碼(它顯示的幀,並創建西側子面板):

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.Toolkit; 
import javax.swing.JFrame; 
import javax.swing.JRootPane; 


public class ArtificialHorizon{ 

    /** 
    * Artificial Horizont program 
    * written in Java 1.6.12 (on Debian 5.0 Lenny) 
    * 
    * @author wilhem 
    * starting date: 15 Januar 2010 
    * 
    * last update: 18 Januar 2010 
    */ 


    /******************************** 
    * Getting the size of the screen 
    ********************************/ 
    private Dimension dimScreenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
    private int xLocation; 
    private int yLocation; 


    /************************** 
    * Definition of the frame 
    * for the main application 
    *************************/ 
    @SuppressWarnings("static-access") 
    public void start(){ 
     JFrame mainFrame = new JFrame("Artificial Horizont"); 
     mainFrame.setUndecorated(true); 
     mainFrame.getRootPane().setWindowDecorationStyle(JRootPane.FRAME); 
     mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainFrame.setSize(1024, 768); 
     xLocation = (dimScreenSize.width- mainFrame.getWidth())/2; 
     yLocation = (dimScreenSize.height - mainFrame.getHeight())/2; 
     mainFrame.setLocation(xLocation, yLocation); 

     mainFrame.setResizable(true); 
     mainFrame.setLayout(new BorderLayout()); 


     /******************************************** 
     * Creating the Left PANEL 
     * which contains the Left Artificial Horizon 
     * for FILTERED Outputs (Processed by Kalman) 
     ********************************************/ 

     ArtificialHorizonPanel leftPanel = new ArtificialHorizonPanel(); 
     ArtificialHorizonPanel rightPanel = new ArtificialHorizonPanel(); 

     mainFrame.getContentPane().add(BorderLayout.WEST, leftPanel); 

     mainFrame.setVisible(true); 

     /************************************************ 
     * Create the class RS232 and the Object "serial" 
     ***********************************************/ 
     SerialConnection serial = new SerialConnection("/dev/ttyUSB0", 9600); 

    } 



    public static void main(String[] args) { 

     ArtificialHorizon artificialHorizon = new ArtificialHorizon(); 
     artificialHorizon.start();  // Starting the application 

    } 

} 

HRE是子面板類(請注意,該代碼尚未完成......因爲我不能「讀」,當已經接收到新的數據重新繪製面板上的drwa):

import gnu.io.SerialPortEventListener; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.geom.Point2D; 
import java.awt.geom.Rectangle2D; 
import javax.swing.JPanel; 


public class ArtificialHorizonPanel extends JPanel{ 

    /************************************ 
    * In this Class the Artificial Horizon 
    ************************************/ 

    /**************************** 
    * Defining instance variables 
    ****************************/ 
    private Color blueSky; 
    private Color orangeEarth; 
    private Dimension dimPanel; 
    private Point2D centerPoint; 
    private int side = 4; 


    /************************************ 
    * Thic constructor will create 
    * the initial panel for the Horizon 
    ************************************/ 
    public ArtificialHorizonPanel(){ 

     dimPanel = new Dimension(400, 700); 
     setPreferredSize(dimPanel); 
     setBackground(Color.black); 

     centerPoint = new Point2D.Double(dimPanel.getWidth()/2, dimPanel.getHeight()/2); // Create a point in the middle of the panel 

     blueSky = new Color(10, 112, 156); 
     orangeEarth = new Color(222, 132, 14); 

    } 

    public void paintComponent(Graphics g){ 

     super.paintComponent(g); 

     Graphics2D g2d = (Graphics2D)g; 

     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

     Rectangle2D rect = new Rectangle2D.Double((centerPoint.getX() - side/2), (centerPoint.getY() - side/2), side, side); 

     g2d.setPaint(Color.orange); 
     g2d.draw(rect); 

    } 

} 

,這裏是爲serialdata類的代碼...(工作pefectly):

import gnu.io.CommPortIdentifier; 
import gnu.io.PortInUseException; 
import gnu.io.SerialPort; 
import gnu.io.SerialPortEvent; 
import gnu.io.SerialPortEventListener; 
import gnu.io.UnsupportedCommOperationException; 
import java.io.BufferedReader; 
import java.io.DataInputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.Enumeration; 
import java.util.TooManyListenersException; 



public class SerialConnection implements SerialPortEventListener{ 

    private Enumeration portList = null; 
    private CommPortIdentifier portId = null; 
    private String defaultPort = null; 
    private boolean portFound = false; 
    private int baudRate = 0; 
    private SerialPort serialPort = null; 
    private DataInputStream is = null; 
    private BufferedReader inStream; 



    /******************************** 
    * Constructor for the base class 
    *******************************/ 
    public SerialConnection(String defaultPort, int baudrate){ 

     this.defaultPort = defaultPort; 
     checkPorts();      // Call a method for checking ports on the System 

    } 


    /************************************ 
    * This method checks the presence of 
    * ports on the System, in affirmative 
    * case initializes and configures it 
    * to receive data on the serial port 
    ***********************************/ 

    public void checkPorts(){ 

     /*************************************** 
     * Get a list of all ports on the system 
     **************************************/ 
     portList = CommPortIdentifier.getPortIdentifiers(); 
     System.out.println("List of all serial ports on this system:"); 

     while(portList.hasMoreElements()){ 
      portId = (CommPortIdentifier)portList.nextElement(); 
      if(portId.getName().equals(defaultPort)){ 
       portFound = true; 
       System.out.println("Port found on: " + defaultPort); 

       initialize();  // If Port found then initialize the port 

      } 
     } 

     if(!portFound){ 
      System.out.println("No serial port found!!!"); 
     } 
    } 

    public void initialize(){ 
     /********************** 
     * Open the serial port 
     *********************/ 
     try{ 
      serialPort = (SerialPort)portId.open("Artificial Horizont", 2000); 
     } catch (PortInUseException ex){ 
      System.err.println("Port already in use!"); 
     } 

     // Get input stream 
     try{ 
      is = new DataInputStream(serialPort.getInputStream()); 
     } catch (IOException e){ 
      System.err.println("Cannot open Input Stream " + e); 
      is = null; 
     } 


     try{ 
      serialPort.setSerialPortParams(this.baudRate, 
              SerialPort.DATABITS_8, 
              SerialPort.STOPBITS_1, 
              SerialPort.PARITY_NONE); 
     } catch (UnsupportedCommOperationException ex){ 
      System.err.println("Wrong settings for the serial port: " + ex.getMessage()); 
     } 


     try{ 
      serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE); 
     } catch (UnsupportedCommOperationException ex){ 
      System.err.println("Check the flow control setting: " + ex.getMessage()); 
     } 

     // Add an event Listener 
     try{ 
      serialPort.addEventListener(this); 
     } catch (TooManyListenersException ev){ 
      System.err.println("Too many Listeners! " + ev); 
     } 

     // Advise if data available to be read on the port 
     serialPort.notifyOnDataAvailable(true); 
    } 


    /********************************** 
    * Method from interface definition 
    *********************************/ 
    public void serialEvent(SerialPortEvent event){ 

     inStream = new BufferedReader(new InputStreamReader(is), 5); 
     String rawInput = null; 

     switch(event.getEventType()){ 
     case SerialPortEvent.BI: 
     case SerialPortEvent.CD: 
     case SerialPortEvent.CTS: 
     case SerialPortEvent.DSR: 
     case SerialPortEvent.FE: 
     case SerialPortEvent.OE: 
     case SerialPortEvent.PE: 
     case SerialPortEvent.RI: 
     case SerialPortEvent.OUTPUT_BUFFER_EMPTY: 
      break; 

     case SerialPortEvent.DATA_AVAILABLE: 
      try { 
       while((rawInput = inStream.readLine()) != null){ 
        System.out.println(rawInput); 
/* 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!HERE I GET THE VALUE FROM THE SERIAL PORT AND THOSE MUST BE "VISIBLE" TO THE SUBPANEL CLASS IN ORDER AND RUN THE METHOD REPAINT!!!!!!!!!!!!!!!!!!!!! 
*/ 
       } 

       inStream.close(); 

      } catch (IOException e) { 
       e.printStackTrace(); 
       System.exit(-1); 
      } 
      break; 

     default: 
      break; 

     } 
    } 

} 

再次...整個代碼運行,但我得到的幀和子面板工作和backgrounf通過串行連接,但在礦井控制檯得到的值...

回答