1

これが、Java GUI 用に実装しているコードです。問題は、シリアル データがビット単位で読み取られるため、データを 3 つの異なるセンサー (プレースホルダーとして 3 つのLM35温度センサー)から分離する方法を考え出すことができないことです。問題は serialevent クラスにあります。

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
}
4

1 に答える 1

0

Arduinoが単純に各センサーから順番に温度を文字列として送信している場合(そうであると思いますが、送信しているものをまったく指定していないため、間違っている可能性があります)、シリアルでリセットを無効にしていないと仮定しますたとえば、最初に読み取った温度はセンサー 1 から、2 番目はセンサー 2 から、3 番目はセンサー 3 から、4 番目はセンサー 1 からというようにします。

ただし、より明確で信頼性の高い方法として、Arduino コードを変更して、生のビットを送信するだけでなく、各読み取り値がどのセンサーから来たかの詳細を送信することをお勧めします。この方法でコードを変更することは、Arduino のPC 側のデータの解析がはるかに簡単になります。

于 2013-04-26T10:47:05.973 に答える