2012-03-26 60 views
0

我是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来处理它。

任何人都可以给我一些建议吗?

+0

你能提供一些代码吗? – 2012-03-26 08:02:30

+0

我正在关注http://code.google.com/p/java-simple-serial-connector/wiki/jSSC_examples上的“SerialPortEventListener”示例代码。 – RichardLiu 2012-03-26 08:11:21

回答

1

我曾与Java通信,从来没有与jssc。 JavaComm提供一个开放的方法是一个超时可被配置:

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

从JSSC Javadoc中的打开方法不管理超时机制。

+0

不幸的是,没有。 jSSC只提供了不带参数的openPort()方法。我知道javax.comm提供了更丰富的功能,但我的目标平台是Win32,并且没有可用的官方javax.comm软件包。我也检查过rxtx软件包,但它需要由最终用户手动设置,在我的情况下这是不可接受的。 – RichardLiu 2012-03-26 08:27:43

+0

@RichardLiu你是什么意思RXTX需要最终用户手动设置?实际上,在RXTX串行库中,有一个叫做CommPortIdentifier的函数。getPortIdentifiers()'方法来枚举系统中的可用串行端口。从这里你可以打开每个串口并检测返回的数据类型。如果数据正确,您可以停止枚举并开始使用正确的串行端口。举个好例子:http://code.google.com/p/aima-java/source/browse/trunk/aimax-osm/src/main/java/aimax/osm/gps/NmeaSerialPortReader.txt?r=619 – 2012-03-26 09:34:28

+0

@RichardLiu如果您需要另一个串行通信库,请检查PureJavaComm,它也提供超时的方法http://www.sparetimelabs.com/purejavacomm/index.html – 2012-03-26 09:47:23

1

我对jSSC并不熟悉,但是如果没有可能通过API传递超时并且您必须自己做,那么来自Apache的ThreadMonitor可能是您的兴趣所在。

用法是这样的:

long timeoutInMillis = 1000; 
try { 
    Thread monitor = ThreadMonitor.start(timeoutInMillis); 
    // do some work here 
    ThreadMonitor.stop(monitor); 
} catch (InterruptedException e) { 
    // timed amount was reached 
} 

我们正在使用RXTX这里串口通信。当监控中出现关键系统状态时,我们有通过串口连接的条形码扫描仪和调制解调器向我们的管理员发送短信。作品完美无瑕。