2010-11-05 77 views
1

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

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

回答

0

你的问题是非常不清楚,但我可以给你一个一般性的建议。

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

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

如果这没有帮助,请用一些Java代码或伪代码来更新问题,以解释您正在尝试执行的操作。

跟进

从您的 “答案” 来看,你似乎误解了什么​​一样。简单地说,它只是停止两个线程同时执行某些代码区域。

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

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

+0

感谢您的纠正。起初,我只是想着不同的线程可以访问相同的数据。首先想到的是将这些数据作为其他线程的参考。我没有想到并发性。感谢提醒我。 – DYL 2010-11-08 04:38:24

0

如果没有关于您的应用程序的额外信息,很难分辨出来。当你说“其他班级”时,你的意思是“其他线程”?

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

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

如果您提供了有关您正在尝试执行的操作的更多信息,我们可能会为您提供进一步帮助。

0

对不起,我的问题不清楚。我应该给出一些我正在使用的代码。请参考下面的链接:

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

基本上此示例代码是通过声明对一些功能的“同步”的关键字与从串行端口上的基于事件的通信那些经典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:一个applet做使用该共享阵列中的数据的2D/3D图形。

功能B:GUI将输出/打印从共享数组计算的一些数字到jframe中的textarea。它也可以用一个按钮打开Function A applet。但也有在GUI中的某些按钮会改变在功能上的一些变量导致不同的行为来处理功能A.共享阵列

这就是我想要的:

由于串行数据进来和解析到数据数组中......

1)功能B将立即打印与此数据阵列相关联的数字。只有当用户点击该按钮才能显示Function A小程序时,功能A将显示2D/3D图形。

2)当功能A和B都处于激活状态时,它们自己的变量会随着输入的串行数据一起发生变化。

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

再次感谢您的耐心等待。

+1

请勿将随访作为答案。如果您希望人们注意到它们,请使用评论。 – 2010-11-07 05:22:11

+0

您能否编辑您的问题以包含附加信息,然后删除此答案? – Grodriguez 2010-11-08 10:00:05