Java Gui与串口通信

Java Gui communication with serial port

我有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 的图形用户界面 class:

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

使用第三个 class 将信息从 Terminal 传递到 Gui 的正确方法是什么:

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
}

谢谢)

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

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

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

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();

Monitorclass.

里面的某个地方

代码执行以下操作:

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

要停止线程,只需调用 messageChecker.interrupt();

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

然后,您需要编写代码,以便在终端 class 有完整消息时立即通知观察者消息。我建议在终端 class 内部设置一个线程,定期检查新数据。一旦它有一个完整的消息,它应该调用 notifyObservers(message)message 显然是一个包含完整消息的 String 类型的变量)。

在监视器class中,你必须有一个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 class(可能是从构造函数)调用 terminal.addObserver(this);,否则 notifyObservers() 将通知您所有的 0 个观察者并且什么也不会发生.

谷歌搜索 "java observer pattern" 可以得到很多有用的资源和示例,以备不时之需。