2011-05-12 61 views
21

我與一個單元通信以通過串行連接控制衛星天線。Java串行端口關閉塊

打開與串行設備的連接:

import gnu.io.CommPortIdentifier; 
import gnu.io.SerialPort; 

portIdentifier = CommPortIdentifier.getPortIdentifier(device); 
serialPort = (SerialPort) portIdentifier.open(name, 
serialPort.setSerialPortParams(baudrate, databits, stopbits, parity); 
serialPort.setFlowControlMode(flowMode); 

bufferedReader = new BufferedReader(new InputStreamReader(serialPort.getInputStream())); 
outputStream = serialPort.getOutputStream(); 

如果單位是不可用的,我有能夠發出新的指令,一旦設備再次之前清除流。但是,如果設備關閉,輸入/輸出流中的這種清除方法會阻塞。同時關閉流或關閉SerialDevice塊。

有沒有辦法關閉/清除這些流或SerialDevice沒有阻止?

bufferedRead.close(); // blocks until device is up again 
outputStream.close(); // blocks until device is up again 
serialPort.close(); // blocks until device is up again 
+2

你好JürgenHannärt,我想這個問題已經過時了,但我用過(並且仍然在使用RXTX-API) - 它對我來說工作正常......你的問題的解決方案可能讓我讀/寫在單獨的線程,這將使端口免費執行關閉操作。 – 2013-12-20 11:30:41

+0

@MartinFrank在單獨的線程中進行讀/寫操作有什麼意義?在設備關閉後,流仍然不能清除 – mangusta 2014-03-18 12:37:12

+1

要麼監聽與設備關閉相關的某些事件(如果有的話),要麼使用循環,在其開始時清除流。他應該檢測到設備關機(例如,在輸入流上接收到「null」或其他特定消息),這將是循環結束的迭代。新的迭代開始於調用clear的地方,但在下一次啓動之前它將被阻塞,並且當設備再次啓動時,迭代繼續直到下一次關閉 – mangusta 2014-03-18 12:53:47

回答

3

我看到這個帖子的同時,我也有同樣的問題使用gnu.io包,這也叫RXTX收盤時的serialport。

這不是最終答案,而是對我找到的替代解決方案的建議。

RXTX有兩個問題,在我看來,如果不是更多:

  1. 根據您的IDE,您需要將適用於Mac:RXTXcomm.jarlibrxtxSerial.jnilib和PC:RXTXcomm.jarrxtxSerial.dll對項目的根您的IDE或Java代碼,它從IDE到IDE各不相同。這裏的文檔並不包括如何做到這一點,並且在NetBeans,IntelliJ等不同的IDE中,即使我在Eclipse和IntelliJ上都能使用它,但還沒有NetBeans。它還有其他痛苦的問題。
  2. 根據您的操作系統,即使您打開並運行此包,以Windows 8.1爲例,它在關閉端口時出現問題。唯一的解決方案是重新啓動IDE /控制檯並重新連接。每次開發項目時,您都可能瘋狂地重新啓動IDE。

我花了很多時間尋找解決辦法並沒有關閉該端口正確或許爲Windows 8.1及更高版本(不知道其他的環境關閉端口的問題)沒有解決,因爲包是老而且支持有限。

因此,我建議去一個叫做JSSC的更令人頭疼的包。

這裏是串行端口使用JSSC一個簡單的讀取數據:

public class Main { 

    public static void main(String[] args) { 
     SerialPort serialPort = new SerialPort("COM1"); 
     try { 
      serialPort.openPort();//Open serial port 
      serialPort.setParams(9600, 8, 1, 0);//Set params. 
      byte[] buffer = serialPort.readBytes(10);//Read 10 bytes from serial port 
      serialPort.closePort();//Close serial port 
     } 
     catch (SerialPortException ex) { 
      System.out.println(ex); 
     } 
    } 
} 

雅,它關閉與出題的端口。

注:這是一個開放式的答案,如果任何人有任何關於此,請通過編輯答案提供相關經驗。 我已經看到有人在互聯網上提出這個問題,並且與RXTX的問題幾乎一樣,並且還沒有找到可行的RXTX解決方案。

我已經回答了以前的類似的問題,用Stackoverflow的question

我想分享我擁有的知識,這對面臨同樣問題的人可能會有用。它可以讓你的一天不那麼痛苦。