我是JAVA编程新手。我被分配了编写一个JAVA GUI应用程序的任务,该应用程序将通过串行端口与外部设备交互。我设法让我的代码能够在Mac OS X和Win32平台下使用jSSC(Java简单串行连接器)包进行编译和运行。 jSSC项目提供了相当好的示例代码,并且使用javax.comm样式的SerialPortEventListener接口实现相当容易。如何在从串行端口读取时在Java中设置超时值?
但很快我就知道,我需要添加“ACK超时”功能到我的实施,以防止错误。在C语言中,可以通过select()API调用轻松实现,第5个参数动态设置为所需的持续时间。但在JAVA中,我不知道如何去做。
我应该通过直接调用serialEvent()方法来设置另一个时间线程并激发定时器生成的事件吗?尽管如此,它可能会导致一些赛车状况。
(03/27 10:43编辑):好的,我已经追踪了jSSC的源代码。看起来jSSC只是在JVM中创建一个新的Runnable线程,当一个Listener注册到它时;并且该线程将通过本地函数调用持续轮询状态,该调用将调用像ioctl()这样的系统api调用。所以在不修改本地库的情况下添加超时事件是不可能的。
猜测我必须改变串口事件处理的方式。我需要创建另一个Runnable线程来处理传入的数据进程,而不是直接从jSSC事件线程解析serialEvent()方法调用中的数据。我可以设置一个计时器来将超时事件引入该线程。
我这种情况下,我需要设置一个事件调度线程,就像SwingUtility.invokelater()。但我不知道自己是否应该从下至上实现一个,或者我可以使用AWT EDT来处理它。
任何人都可以给我一些建议吗?
你能提供一些代码吗? – 2012-03-26 08:02:30
我正在关注http://code.google.com/p/java-simple-serial-connector/wiki/jSSC_examples上的“SerialPortEventListener”示例代码。 – RichardLiu 2012-03-26 08:11:21