Java GUI与串口通信

标签 java swing serial-port runnable

我有一个类,可以从串行端口接收和发送信息:

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
}

谢谢)

最佳答案

我将使用 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(); 仅返回部分消息,即在我们调用它之前收到的消息,我认为最好的方法是使用观察者模式。

  • 使终端类实现接口(interface) Observable
  • 使 Monitor 类实现接口(interface) Observer

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

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

// 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 个观察者,但什么也没有发生。

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

关于Java GUI与串口通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30100354/

相关文章:

java - 如何更新 JTable 中 DefaultTableModel 的行?

serial-port - Tera Term 发送 8 位二进制数据

serial-port - 两个 USART 中断的溢出错误

java - Andengine 中 Sprite 闪烁

java - 使用 getGenerateKeys 获取更新记录主键失败 - MyBatis

java - Android:使用 YouTube API 时应用程序存在后退点击

java - jackson AfterburnerModule 在日志中发出警告

java - 如何获取 JList 中的项目并将其删除?

java - JSlider 事件触发两次

c# - 在 C# 中,SerialPort 类的 DataReceived 事件处理程序是否在它自己的线程上执行?