2013-03-15 375 views
1

所以這裏是我們爲Java GUI實現的代碼。問題是,由於串行數據是以位爲單位讀取的,我們似乎無法想出將數據從三個不同傳感器(三個溫度傳感器作爲佔位符)分開的方法。問題在於serialevent類。在Arduino上解析從多個傳感器讀取的數據

import gnu.io.*; 
import java.awt.Color; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.util.Enumeration; 
import java.util.HashMap; 
import java.util.Scanner; 
import java.util.TooManyListenersException; 

public class Communicator implements SerialPortEventListener 
{ 
    //Passed from main GUI. 
    GUI window = null; 

    //For containing the ports that will be found. 
    private Enumeration ports = null; 
    //map the port names to CommPortIdentifiers 
    private HashMap portMap = new HashMap(); 

    //This is the object that contains the opened port. 
    private CommPortIdentifier selectedPortIdentifier = null; 
    private SerialPort serialPort = null; 

    //Input and output streams for sending and receiving data. 
    private InputStream input = null; 
    private OutputStream output = null; 

    //Just a boolean flag that I use for enabling 
    //and disabling buttons depending on whether the program 
    //is connected to a serial port or not. 
    private boolean bConnected = false; 

    //The timeout value for connecting with the port. 
    final static int TIMEOUT = 2000; 

    //Some ASCII values for for certain things. 
    final static int SPACE_ASCII = 32; 
    final static int DASH_ASCII = 45; 
    final static int NEW_LINE_ASCII = 10; 

    //A string for recording what goes on in the program; 
    //this string is written to the GUI. 
    String logText = ""; 

    public Communicator(GUI window) 
    { 
     this.window = window; 
    } 

    //Search for all the serial ports 
    // Pre: none 
    // Post: adds all the found ports to a combo box on the GUI 
    public void searchForPorts() 
    { 
     ports = CommPortIdentifier.getPortIdentifiers(); 

     while (ports.hasMoreElements()) 
     { 
      CommPortIdentifier curPort = (CommPortIdentifier)ports.nextElement(); 

      //Get only serial ports 
      if (curPort.getPortType() == CommPortIdentifier.PORT_SERIAL) 
      { 
       window.cboxPorts.addItem(curPort.getName()); 
       portMap.put(curPort.getName(), curPort); 
      } 
     } 
    } 

    //Connect to the selected port in the combo box 
    // Pre : ports are already found by using the searchForPorts method 
    // Post: the connected communications port is stored in commPort, otherwise, 
    //  an exception is generated 
    public void connect() 
    { 
     String selectedPort = (String)window.cboxPorts.getSelectedItem(); 
     selectedPortIdentifier = (CommPortIdentifier)portMap.get(selectedPort); 

     CommPort commPort = null; 

     try 
     { 
      //The method below returns an object of type CommPort 
      commPort = selectedPortIdentifier.open("TigerControlPanel", TIMEOUT); 
      //The CommPort object can be casted to a SerialPort object 
      serialPort = (SerialPort)commPort; 

      //For controlling GUI elements 
      setConnected(true); 

      //Logging 
      logText = selectedPort + " opened successfully."; 
      window.txtLog.setForeground(Color.black); 
      window.txtLog.append(logText + "\n"); 
      window.txtLog1.setForeground(Color.black); 
      window.txtLog1.append(logText + "\n"); 
      window.txtLog2.setForeground(Color.black); 
      window.txtLog2.append(logText + "\n"); 

      //CODE ON SETTING BAUD RATE, ETC. OMITTED 
      //XBEE PAIR IS ASSUMED TO HAVE THE SAME SETTINGS ALREADY 

      //Enables the controls on the GUI if a successful connection is made 
      window.keybindingController.toggleControls(); 
     } 
     catch (PortInUseException e) 
     { 
      logText = selectedPort + " is in use. (" + e.toString() + ")"; 

      window.txtLog.setForeground(Color.RED); 
      window.txtLog.append(logText + "\n"); 
      window.txtLog1.setForeground(Color.RED); 
      window.txtLog1.append(logText + "\n"); 
      window.txtLog2.setForeground(Color.RED); 
      window.txtLog2.append(logText + "\n"); 
     } 
     catch (Exception e) 
     { 
      logText = "Failed to open " + selectedPort + "(" + e.toString() + ")"; 
      window.txtLog.append(logText + "\n"); 
      window.txtLog.setForeground(Color.RED); 
      window.txtLog1.append(logText + "\n"); 
      window.txtLog1.setForeground(Color.RED); 
      window.txtLog2.append(logText + "\n"); 
      window.txtLog2.setForeground(Color.RED); 
     } 
    } 

    //Open the input and output streams 
    // pre: an open port 
    // post: initialized intput and output streams for use to communicate data 
    public boolean initIOStream() 
    { 
     //Return value for whather opening the streams is successful or not 
     boolean successful = false; 

     try { 
      input = serialPort.getInputStream(); 
      output = serialPort.getOutputStream(); 
      successful = true; 
      return successful; 
     } 
     catch (IOException e) { 
      logText = "I/O Streams failed to open. (" + e.toString() + ")"; 
      window.txtLog.setForeground(Color.red); 
      window.txtLog.append(logText + "\n"); 
      window.txtLog1.setForeground(Color.red); 
      window.txtLog1.append(logText + "\n"); 
      window.txtLog2.setForeground(Color.red); 
      window.txtLog2.append(logText + "\n"); 
      return successful; 
     } 
    } 

    //Starts the event listener that knows whenever data is available to be read 
    // pre: an open serial port 
    // post: an event listener for the serial port that knows when data is recieved 
    public void initListener() 
    { 
     try 
     { 
      serialPort.addEventListener(this); 
      serialPort.notifyOnDataAvailable(true); 
     } 
     catch (TooManyListenersException e) 
     { 
      logText = "Too many listeners. (" + e.toString() + ")"; 
      window.txtLog.setForeground(Color.red); 
      window.txtLog.append(logText + "\n"); 
      window.txtLog1.setForeground(Color.red); 
      window.txtLog1.append(logText + "\n"); 
      window.txtLog2.setForeground(Color.red); 
      window.txtLog2.append(logText + "\n"); 
     } 
    } 

    //Disconnect the serial port 
    // pre : an open serial port 
    // post: clsoed serial port 
    public void disconnect() 
    { 
     //Close the serial port 
     try 
     { 
      serialPort.removeEventListener(); 
      serialPort.close(); 
      input.close(); 
      output.close(); 
      setConnected(false); 
      window.keybindingController.toggleControls(); 

      logText = "Disconnected."; 
      window.txtLog.setForeground(Color.red); 
      window.txtLog.append(logText + "\n"); 
      window.txtLog1.setForeground(Color.red); 
      window.txtLog1.append(logText + "\n"); 
      window.txtLog2.setForeground(Color.red); 
      window.txtLog2.append(logText + "\n"); 
     } 
     catch (Exception e) 
     { 
      logText = "Failed to close " + serialPort.getName() + "(" + e.toString() + ")"; 
      window.txtLog.setForeground(Color.red); 
      window.txtLog.append(logText + "\n"); 
      window.txtLog1.setForeground(Color.red); 
      window.txtLog1.append(logText + "\n"); 
      window.txtLog2.setForeground(Color.red); 
      window.txtLog2.append(logText + "\n"); 
     } 
    } 

    final public boolean getConnected() 
    { 
     return bConnected; 
    } 

    public void setConnected(boolean bConnected) 
    { 
     this.bConnected = bConnected; 
    } 

    //What happens when data is received 
    // pre : serial event is triggered 
    // post: processing on the data it reads 
    public void serialEvent(SerialPortEvent evt) { 
     if (evt.getEventType() == SerialPortEvent.DATA_AVAILABLE) 
     { 
      try 
      { 
       byte singleData = (byte)input.read(); 
       //byte[] buffer = new byte[128]; 

       if (singleData != NEW_LINE_ASCII) 
       { 
        logText = new String(new byte[] {singleData}); 
        window.txtLog.append(logText); 
       } 
       else 
       { 
        window.txtLog.append("\n"); 
       } 
      } 
      catch (Exception e) 
      { 
       logText = "Failed to read data. (" + e.toString() + ")"; 
       window.txtLog.setForeground(Color.red); 
       window.txtLog.append(logText + "\n"); 
      } 
     } 
    } 

    //Method that can be called to send data 
    // pre : open serial port 
    // post: data sent to the other device 
} 
+0

對不起,您有三個lm35s,數據如何發送?從Arduino? Arduino是否連接到所有三個傳感器?你可以顯示Arduino發送的日誌嗎? – angelatlarge 2013-03-15 03:56:24

回答

0

如果Arduino是簡單地發送回溫從在序列中的每個傳感器(我認爲它不過是什麼它發送在你沒有指定,所以我可能是錯的)的字符串,然後假設你在串行連接上沒有禁用復位,您可以簡單地記下溫度進來的順序 - 比如第一個溫度讀數來自傳感器1,第二個來自傳感器2,第三個來自傳感器3,第四個來自傳感器1 , 等等。

但是,爲了更清晰和更可靠的方式,我建議修改Arduino代碼,以發送每個讀取來自哪個傳感器的詳細信息,而不僅僅是發回原始位 - 以這種方式更改代碼應該是相對的來自Arduino方面的微不足道的,然後使解析數據PC端更容易。