Java Gui与串口通信

时间:2015-05-07 11:55:59

标签: java swing serial-port runnable

我有Class,它从串口接收和发送信息:

public class Terminal implements Runnable
{
    static LinkedList<String> receiver = new LinkedList<String>();
    public Terminal()
    {
        //...
    }
    public String getReceivedMessage()
    {
        String data = receivedMessfges.removeFirst();
        return data;
    }
    // Other function that perform connection to COM port
    // ...
}

我也有基于Swing的gui课程:

public class Gui extends JFrame
{
// Functions that display information, received from COM port
}

使用第三类从TerminalGui传递信息的正确方法是什么:

public class Monitor
{
    static Gui gui;
    static terminal terminal;
    public static void main(String args[])
    {
        monitor = new Monitor();
    }
    public Monitor()
    {
        gui = new Gui();
        terminal = new Terminal();
    }
    // Functions, that get information COM port
    // using getReceivedMessage() function
    // and display it on Gui
}

感谢)

2 个答案:

答案 0 :(得分:2)

我会使用Monitor类在GuiTerminal之间进行通信。

如果receivedMessfges.removeFirst();在收到应该显示在gui中的完整消息后才返回,您可以这样做:

Thread messageChecker = new Thread(new Runnable() {
    public void run() {
        while (!Thread.isInterrupted()) {
            String message = terminal.getReceivedMessage();
            // Prepare message for gui display
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    gui.methodToDisplayTheReceivedMessage(message);
                }
            }
        }
    }
}).start();

Monitor班内的某个地方。

代码执行以下操作:

  • 创建一个新的Runnable(匿名类)
    • 使用run()方法
      • 检查线程是否已被中断
      • 如果有,请停止
      • 如果没有,请等到我们收到新消息并发送给gui。
  • 创建一个新的线程集,以执行新Runnable
  • run()方法
  • 启动此主题。
  • 将对线程的引用分配给变量messageChecker

要停止线程,只需拨打messageChecker.interrupt();

另一方面,如果terminal.getReceivedMessage();仅返回部分消息,即在我们调用它之前收到的消息,我认为最好的方法是使用观察者模式。

然后,您需要编写代码,以便在终端类具有完整消息时立即通知观察者。我建议让Terminal类内部的Thread定期检查新数据。只要有完整的消息,就应该调用notifyObservers(message)message显然是包含完整消息的String类型的变量。)

在Monitor类中,您必须使用update(Observable o, Object arg)方法来满足Observer接口:

// In the Monitor class
void update(Observable terminal, Object message) {
    SwingUtilities.invokeLater(new Runnable() {
        gui.methodToDisplayTheReceivedMessage((String)message); // This cast is safe, since we only ever call notifyObservers() with a string argument.
    }
}

最后但并非最不重要的是,您需要从Monitor类(可能是构造函数)调用terminal.addObserver(this);,否则notifyObservers()将通知所有0个观察者并且没有任何反应。

Google搜索“java观察者模式”会产生大量有用的资源和示例,以防您想了解更多信息。

答案 1 :(得分:1)

您可以使用外部接口,例如将数据写入文件并从那里读取....