我是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