我是JAVA编程的新手。我被分配编写一个JAVA GUI应用程序的任务,该应用程序将通过串行端口与外部设备进行交互。我设法使代码编译并在Mac OS X和Win32平台下使用jSSC(Java简单串行连接器)程序包运行。 jSSC项目提供了不错的示例代码,并且使用javax.comm风格的SerialPortEventListener接口很容易实现。

但是很快我就知道我需要在实现中添加“ ACK超时”功能,以防止错误。在C语言中,可以通过将第5个参数动态设置为所需持续时间的select()API调用轻松实现。但是在JAVA中,我没有一个如何做的线索。

我是否应该通过直接调用serialEvent()方法来设置另一个时间线程并触发计时器生成的事件?但是,这可能会导致某些赛车状况。



(03/27 10:43编辑):好的,我已经跟踪了jSSC的源代码。当侦听器注册到jSSC时,它似乎只是在JVM中创建了一个新的Runnable线程。并且该线程将使用本机函数调用连续轮询状态,该函数将调用系统api调用,如ioctl()。因此,在不修改本机库的情况下添加超时事件是不可能的。

猜猜我必须更改串行端口事件处理的方式。我需要创建另一个Runnable线程来处理传入的数据过程,而不是直接从jSSC事件线程的serialEvent()方法调用中解析数据。而且我可以设置一个计时器,将超时事件抛出该线程。

在这种情况下,我需要设置一个事件调度线程,就像SwingUtility.invokelater()一样。但是我不知道我是否应该从下而上实现一个,还是可以使用AWT EDT来处理它。

谁能给我一些建议?

最佳答案

我曾经使用过Java comm,从来没有使用过jssc。 JavaComm提供了一个可以配置超时的开放方法:

serialPort1 = (SerialPort) portId1.open("ComControl", 2000);


从jssc javadoc中,open方法不管理超时机制。

07-28 00:36