首页 文章

Java:对串口传入数据进行观察或同步notify()

提问于
浏览
1

我有一个带有数据的串口 . 我通过串口事件监听器实现了与RXTX库的串口连接 . 因此,只要串行端口中有可用的传入数据,就会运行同步函数serialEvent(SerialPortEvent oEvent) . 基本上,当数据连续进入时,程序将处于无限循环中 . 我将传入的数据组织成一个整数数组 . 现在我希望这个数组与我的其他类共享,这些类将使这个数组执行不同的任务 . 我可以说,由于串行事件监听器在循环中运行并且数组不断变化,我希望所有其他类共享这个已更改的数组数据 . 我以前学过一些关于java.util.observables的东西 . 当我在线搜索时,我看到其他人使用sychronized()和notify()/ notifyAll()来共享线程之间的变量 .

我不确定哪一个最好用?如果他们都在这种情况下工作,那么我需要注意哪些最重要的部分?有没有其他方法可以实现我想要的?

3 回答

  • 0

    没有关于您的应用程序的其他信息,这很难说 . 当你说“其他类”时,你的意思是“其他线程”吗?

    如果您的其他类是线程,并且您希望它们等待新数据,那么只要有新数据,就可以让它们 wait() 并使您的串行端口事件监听器 notifyAll() . 这将唤醒正在等待的线程 . 但请注意,这只解决了通知:您仍然需要处理对数据数组的并发访问,因为新数据可能会在其他线程访问时到达 .

    另一方面,如果使用 Observable ,那么当您调用 Observable.notifyObservers() 时,这将导致调用每个 Observerupdate() 方法,所有这些方法都在当前线程(调用 Observable.notifyObservers() 的线程)的上下文中 . 如果您希望其他线程访问数据,您仍需要某种方式来通知它们(例如,您的 update() 方法可能最终实际调用 notify() ) .

    如果您提供有关您要执行的操作的更多信息,我们可能会为您提供进一步的帮助 .

  • 0

    对不起,我的问题不明确 . 我应该给出一些我正在使用的代码 . 请参考以下链接:

    http://www.arduino.cc/playground/Interfacing/Java

    基本上,此示例代码与通过在某些函数上声明“synchronized”关键字在串行端口上进行基于事件的通信的经典rxtx示例不同 . 我正在处理的唯一部分是在串行事件监听器中:

    public synchronized void serialEvent(SerialPortEvent oEvent) {
    
        if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
            try {
                ////////////////////////////////////
                1) I will parse the incoming data into an integer array
                2) this array will be shared with other classes, let me
                  explain some of them below.....
                ////////////////////////////////////
            } catch (Exception e) {
                System.err.println(e.toString());
            }
        }
    }
    

    功能A:使用此共享阵列中的数据执行2D / 3D图形的小程序 .

    功能B:GUI将从共享阵列计算的一些数字输出/打印到jframe中的textarea . 它还可以通过按钮打开Function A applet . 但是GUI中有一些按钮会改变函数A中的一些变量,导致函数A处理共享数组的行为不同 .

    这就是我要的:

    随着串行数据进入并解析成数据阵列....

    1)功能B将立即打印与该数据阵列相关的数字 . 仅当用户单击按钮以显示功能A小程序时,功能A才会显示2D / 3D图形 .

    2)当功能A和B都处于活动状态时,它们自己的变量会随着输入的串行数据而变化 .

    我希望函数A和B能够立即捕获共享数据数组中的更改,因为它在serialEvent()中已更改 . 我知道最简单的方法是将数据数组作为参考传递,并在下一个输入数据可用之前调用每个函数 . 但是 Grodriguez 之前提到的问题 . 功能A或B正在进行时,可能会有一些丢失的输入数据 . 几年前我在java中做了一些关于MVC的事情,它在不同的类或GUI之间使用obervable来显示温度 . 就像我在文本框中输入温度一样,带滑块的另一个GUI将更改为输入温度 . 当我在这里更改滑块时,它将改变其他GUI中的温度 . 连续事件让我想起这个应用程序 . 我不确定这是否是在这里应用的最佳方法,或者可能有其他更好,更简单的方法来完成我想要的 .

    再次感谢您的耐心等待 .

  • 0

    你的问题非常不清楚,但我可以给你一条一般的建议 .

    该使用串行端口对象的简单方法是打开输入或输出流,只读取/写入字节 . 事件内容适用于您不希望线程阻塞等待读取数据的情况 .

    我建议你仔细阅读这些RXTX examples,特别是前两个说明基于流和事件的方法 .

    如果这没有帮助,请使用一些Java代码或伪代码更新问题,以解释您要执行的操作 .

    FOLLOW UP

    从你的"answer"判断,你似乎误解了 synchronized 的作用 . 简单地说,它只是阻止两个线程同时执行某些代码区域 .

    您的问题还涉及一个线程以某种方式告诉另一个线程新数据已到达并需要处理 . 并且,您还遇到了在第一个线程用下一个数据块覆盖数据之前必须处理数据的问题 .

    我建议您首先阅读Concurrency上的Java Tutorial流 . 这可能不会直接解决您的问题,但它应该让您开始以正确的方式思考问题 .

相关问题