显示JTextField中串行端口的输出

时间:2014-01-03 08:28:41

标签: java swing serial-port jtextfield event-dispatch-thread

这是来自RXTX串行通信程序的示例代码的一部分。 我想知道如何提取我创建的字符串变量来存储输出,以便我可以在另一个类中使用它。输出显示在控制台上,但我想在JTextfield中显示它,我无法提取它。我已经完成了GUI部分。 首先,我将展示主要部分:

    public class MainSerialGui {

public static void main(String[] args) {


        SerialGui vimal = new SerialGui ();

        vimal.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        vimal.setSize(250, 200);
        vimal.setVisible(true);

}

}

这是GUI部分

public class SerialGui extends JFrame  { //inherit all the stuff from JFrame and let us create a window

private  JTextField item1;
private JButton readButton;


public SerialGui (){                                

    setLayout(new FlowLayout());                  

    item1 = new JTextField("Display Output");
    add(item1);
    readButton = new JButton("Read Data");
    add(readButton);



    thehandler handler = new thehandler();      

    readButton.addActionListener(handler);


}


private class thehandler implements ActionListener {           
    public void actionPerformed(ActionEvent event) {         



    if(event.getSource() == readButton){



        String portName = "COM4";

        try{
        CommPortIdentifier portIdentifier =  CommPortIdentifier.getPortIdentifier(portName);  
        if ( portIdentifier.isCurrentlyOwned() )                                             
        {
            System.out.println("Error: Port is currently in use");
        }

        else
        {
            CommPort commPort = portIdentifier.open(this.getClass().getName(),2000);        

            if ( commPort instanceof SerialPort )                                           
            {
                SerialPort serialPort = (SerialPort) commPort;                              
                serialPort.setSerialPortParams(57600,
                        SerialPort.DATABITS_8,
                        SerialPort.STOPBITS_1,
                        SerialPort.PARITY_NONE); // Setting port parameters

               InputStream in = serialPort.getInputStream();                 
               OutputStream out = serialPort.getOutputStream(); 

                (new Thread(new SerialReader(in))).start(); 

                SerialReader comm = new SerialReader(null);
                    item1.setText(comm.str);
            }
        }

        }

        catch (Exception e){

            e.printStackTrace();
            System.out.println("Only serial ports please");

        }  

}


    }

    }

}

这是一个单独的类,用于从comm端口读取数据。

public class SerialReader implements Runnable {
    InputStream in;
    public String str;

    public SerialReader ( InputStream in )
    {
        this.in = in;     
    }

    public void run ()
    {
        byte[] buffer = new byte[1024];
        int len = -1;      
        try
        {
            while ( ( len = this.in.read(buffer)) > -1 )
            {
                str = new String(buffer,0,len); // I would like to take this String
                System.out.print(str);                 // and use it to display in a 
            }                                              // Jtextfield         
        }

        catch ( IOException e )
        {
            e.printStackTrace();
        } 
    }
} 

这是我最初提取它以在文本字段中显示的方式,但结果显示为null。我将str声明为公共字符串,以便在GUI类中可见。正在读取的数据可以在控制台中显示,但文本字段中没有更改。是因为它甚至在输出存储在str之前或者因为'null'参数之前取值? 我无法用任何其他参数替换它。

    SerialReader comm = new SerialReader(null);
                    item1.setText(comm.str);

http://rxtx.qbang.org/wiki/index.php/Two_way_communcation_with_the_serial_port

1 个答案:

答案 0 :(得分:0)

您正在创建两个SerialReader实例,并在使用另一个的输出时启动其中一个实例。

尝试更换,

(new Thread(new SerialReader(in))).start(); 
SerialReader comm = new SerialReader(null);
item1.setText(comm.str);

SerialReader comm = new SerialReader(in);
Thread commThread = new Thread(comm);
commThread.start();
commThread.join();
item1.setText(comm.str);

希望这有帮助。