0

我有一个叫做 Main 的类。爪哇。在此输出由 inputLine 显示,它是从 com 端口串行获取的字符串。我希望在同一个默认包中的其他一些类中使用这个字符串值。我如何在其他类中调用此字符串。如何创建此类的实例并在任何其他 xyz.java 类中调用字符串 inputLine。一个例子会很有帮助。

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import gnu.io.CommPortIdentifier;
    import gnu.io.SerialPort;
    import gnu.io.SerialPortEvent;
    import gnu.io.SerialPortEventListener;
    import java.util.Enumeration;


public class Main implements SerialPortEventListener
{
    SerialPort serialPort;
        /** The port we're normally going to use. */
    private static final String PORT_NAMES[] = {
            "COM30", // Windows
    };
    /**
    * A BufferedReader which will be fed by a InputStreamReader
    * converting the bytes into characters
    * making the displayed results codepage independent
    */
    private BufferedReader input;
    /** The output stream to the port */
    private OutputStream output;
    /** Milliseconds to block while waiting for port open */
    private static final int TIME_OUT = 2000;
    /** Default bits per second for COM port. */
    private static final int DATA_RATE = 9600;

    public void initialize() {
        CommPortIdentifier portId = null;
        Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();

        //First, Find an instance of serial port as set in PORT_NAMES.
        while (portEnum.hasMoreElements()) {
            CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();
            for (String portName : PORT_NAMES) {
                if (currPortId.getName().equals(portName)) {
                    portId = currPortId;
                    break;
                }
            }
        }
        if (portId == null) {
            System.out.println("Could not find COM port.");
            return;
        }

        try {
            // open serial port, and use class name for the appName.
            serialPort = (SerialPort) portId.open(this.getClass().getName(),
                    TIME_OUT);

            // set port parameters
            serialPort.setSerialPortParams(DATA_RATE,
                    SerialPort.DATABITS_8,
                    SerialPort.STOPBITS_1,
                    SerialPort.PARITY_NONE);

            // open the streams
            input = new BufferedReader(new InputStreamReader(serialPort.getInputStream()));
            output = serialPort.getOutputStream();

            // add event listeners
            serialPort.addEventListener(this);
            serialPort.notifyOnDataAvailable(true);
        } catch (Exception e) {
            System.err.println(e.toString());
        }
    }

    /**
     * This should be called when you stop using the port.
     * This will prevent port locking on platforms like Linux.
     */
    public synchronized void close() {
        if (serialPort != null) {
            serialPort.removeEventListener();
            serialPort.close();
        }
    }

    /**
     * Handle an event on the serial port. Read the data and print it.
     */
    public synchronized void serialEvent(SerialPortEvent oEvent) {
        if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
            try {
                String inputLine=input.readLine();
                System.out.println(inputLine);

            } catch (Exception e) {
                System.err.println(e.toString());
            }
        }
        // Ignore all the other eventTypes, but you should consider the other ones.
    }

    public static void main(String[] args) throws Exception {
        Main main = new Main();
        main.initialize();
        Thread t=new Thread() {
            public void run() {
                //the following line will keep this app alive for 1000 seconds,
                //waiting for events to occur and responding to them (printing incoming messages to console).
                try {Thread.sleep(1000000);} catch (InterruptedException ie) {}
            }
        };
        t.start();
        System.out.println("Started");
    }
}
4

3 回答 3

0

首先,如果您想在其他地方访问变量,则该变量必须是实例变量或类变量,在方法中创建的变量只能存在于该方法内部,并且一旦方法返回就会消失。

In order to access the variable from another class you have to make it available, there are no friends in Java as in C++. You have 3 options.

  • Create a public instance variable, then provide a reference to the instance to those that need to access the information.
  • Create a private instance variable and public setter/getter methods to access it from the outside, then provide a reference to the instance to those that need to access the information.
  • Create a public static (class) variable.
于 2013-03-30T07:26:42.677 回答
0

In your case, you should just create a class variable. Just declare inside the class, public static String inputLine; Change String inputLine=input.readLine(); to inputLine=input.readLine(); and you can access it from other classes in the same package using Main.inputLine.

于 2013-03-30T07:29:59.127 回答
0

Sounds like the Observer Pattern for me...

Create an Interface eg. SerialListener that every class to be informed implements. The interface has one method with string parameter that is called by your Main Class every time new information arrives. And of cause the main class has methods to register new listeners and stores them in a list

List toBeCalled = new ArrayList()

Just like other Listeners in Swing etc.

于 2013-03-30T07:31:06.910 回答