2012-02-15 108 views
1

這是我的Java串行通信中的問題...我的jennic硬件設備使用UART連接。我想檢索值形成我的設備..SerialPort閱讀java

我收到串的字節數組中SerialPortEvent.DATA_AVAILABLE

 case SerialPortEvent.DATA_AVAILABLE: 
      try { 
        int size; 
        while(inputStream.available()!=0) { 
         byte buff[]=new byte[100]; 
         size=inputStream.read(buff); 
         inputStream.close(); 
         String result = new String(buff,0,size); 
         ZPS_tsAplZdpIeeeAddrRsp IeeRsp = new ZPS_tsAplZdpIeeeAddrRsp(result); 
       } 

第一I讀取的字節並將其存儲在BUFF []。然後將其轉換爲字符串,然後將其轉換爲字符串數組..然後我的問題是我得到了很多時間,但它的休息。

輸出示例:

80011634002078445541560000341201004189 

    80011635002078445541560000341201004189 

    80011636002078445541560000341201004189 
    /*Here is Break my seq */ 
    800116370020784455 

    41560000341201004189/*this two breaking seq generated two separate array and here is the problem*/ 

    80011638002078445541560000341201004189 

有衝廁我曾嘗試inputStream.reset(),但它不工作的輸入緩衝區的問題..誰能給我一個合適的建議,以解決這個問題。 。

感謝...

回答

0

您需要從端口讀取到緩衝區中,並且當該緩衝區有整個消息時,將該緩衝區的一部分刷新到消息處理例程中。這意味着您需要以可以獨立識別和隔離每條消息的方式定義消息。

當數據可用或不可用時,讀取數據流將工作或阻止;但是,從流中讀取並不能保證您將數據保存在一個消息大小的塊中。您只會注意到有數據需要讀取。您注意到數據可用於在串行端口緩衝區中讀取,並且在可讀取所有消息之前開始讀取它。請記住,還有另一個問題可能發生,也許在另一次運行期間,在程序準備好讀取「下一個」消息之前,可能會在串行端口緩衝區中緩衝兩個或更多消息。

重寫您的通信協議以將字節讀入緩衝區(類),該緩衝區保存字節,直到消息可供讀取。然後在緩衝區readMessage()上放置一個接口,除了在消息級別(緩衝直到獲得完整消息)之外,其作用類似於read()

1

'問題' 是在您的期望。它沒有任何地方說read()會填充緩衝區,或者串行數據傳輸將保留你的消息邊界。這取決於你。你得到的只是一個字節流。

0

一般而言,您不能期望從串行連接的一端發送的「消息」將作爲一個組被接收。你可以一次或者以幾個不同長度的塊來完成。由接收程序決定如何使用它所知道的輸入數據來從串口讀取字節並將它們放在一起,並在接收到完整的消息時實現。

通常器件的三種方式之一處理這個問題:

  • 固定長度的數據包 - 你看,直到你獲得X字節,然後再處理那些X字節。
  • 數據包長度是數據包標題的一部分,表明在考慮接收到的數據之前還有多少額外字節需要讀取完整的數據包。
  • 數據包開始/結束指示符(STX或SOH啓動,ETX通常結束)。您將開始和結束指示符之間收到的所有數據視爲一個消息數據包。