2012-03-26 57 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這裏串口通信。當監控中出現關鍵系統狀態時,我們有通過串口連接的條形碼掃描儀和調制解調器向我們的管理員發送短信。作品完美無瑕。