2015-09-22 123 views
0

我正在使用名爲jSSC(java-simple-serial-connector)的庫與外部設備一起編寫Java中的串行端口通信應用程序。關閉並重新打開端口後的串行端口通信

在發送消息並等待其返回後,如果在一定時間(2秒)後沒有讀數,則會有超時中止讀數。如果發生這種情況,端口將關閉並重新打開以進一步進行消息交換。

我注意到,如果由於某種原因超時發生,並且端口被關閉並重新打開,則來自端口的進一步的消息讀取將受到干擾(即,讀取的消息不能被解碼)。看起來來自設備的之前的消息仍然在線,並繼續進入下一個閱讀操作。

我對串口不是很熟悉,所以我不完全確定是否是這種情況。我認爲(但很可能是錯誤的)在我關閉連接後(如在TCP/IP通信中),由另一部分發送的先前消息將被丟棄。

任何人都可以在這個話題上了解關於串行端口在關閉/重新打開後的行爲方式嗎?即使在關閉應用程序中的連接後,其他部分(設備)是否可以繼續發送舊消息?

+0

你可以在這個鏈接回答我的問題http://stackoverflow.com/questions/33561947/close-my-ports-programatically-using-netbeans –

回答

1

在你的情況,我認爲如果超時你應該執行一個清除然後關閉端口,然後再嘗試重新打開它。

if (serialPort! = null && serialPort.isOpened()) { 
    serialPort.purgePort (1); 
    serialPort.purgePort (2); 
    serialPort.closePort(); 
} 
+0

感謝您的輸入。你能解釋一下嗎? purgePort有什麼作用? – Wudong

+0

似乎無法正常工作... – Wudong

+0

清除意味着清除端口緩衝區中的任何數據。另一點:可能是這些垃圾數據來自你的設備,當它斷開連接時,它將一些數據保存在它的IO緩衝區中,然後當它重新連接到PC串行端口時,它會將它的負載發送到PC,這樣你就會面對這些垃圾數據。 –

0

您應該在關閉時清除端口,但在串行端口打開的時候清除端口。操作系統和驅動程序爲串口數據維護自己的緩衝區。當清除被調用時,它實際上調用操作系統(和驅動程序)的flush函數,並且這是之前收到的數據被丟棄(刪除)的地方。也嘗試使用串行通信管理器等任何其他庫。