2012-05-27 65 views
0

我在從微控制器檢索數據時遇到了一些困難。我以2000字節的塊形式傳輸數據,並且在創建一個新的調用發送下一個2k字節之前寫了一個線程來處理這些2000字節。大多數情況下,它工作得很好,但有時我傾向於得到一個字節太多,或由於某種原因,一個字節太少,這只是在案#2。如果我使用案例#1它總是完美無瑕,但由於某種原因它非常緩慢。我們在10秒內談論2000個字節,當我將串口設置爲115.200波特時,這太慢了。RXTX的問題 - 正在接收大量的字節數

情況#1(始終工作,但速度很慢)

public void serialEvent(SerialPortEvent event) 
{ 
    switch (event.getEventType()) 
    { 
     case SerialPortEvent.BI: 
     case SerialPortEvent.OE: 
     case SerialPortEvent.FE: 
     case SerialPortEvent.PE: 
     case SerialPortEvent.CD: 
     case SerialPortEvent.CTS: 
     case SerialPortEvent.DSR: 
     case SerialPortEvent.RI: 
     case SerialPortEvent.OUTPUT_BUFFER_EMPTY: 
      break; 
     case SerialPortEvent.DATA_AVAILABLE: 

      try 
      { 
       byte singleData = (byte) buffer.read(); 
       gasArray.setMessage(singleData); 
        if (gasArray.isBusy()) 
        { 
         gasArray.setProcessing(); 
         while (gasArray.isProcessing()) 
         { 
          continue; 
         } 
        } 
        else 
         gasArray.appendChat("Incoming data: " + singleData); 
       } 
     } 

案例#2(獲取有時卡住,但速度非常快)

public void serialEvent(SerialPortEvent event) 
{ 

    switch (event.getEventType()) 
    { 
     case SerialPortEvent.BI: 
     case SerialPortEvent.OE: 
     case SerialPortEvent.FE: 
     case SerialPortEvent.PE: 
     case SerialPortEvent.CD: 
     case SerialPortEvent.CTS: 
     case SerialPortEvent.DSR: 
     case SerialPortEvent.RI: 
     case SerialPortEvent.OUTPUT_BUFFER_EMPTY: 
      break; 
     case SerialPortEvent.DATA_AVAILABLE: 

      try 
      { 
       while (buffer.available() > 0) 
       { 
        byte singleData = (byte) buffer.read(); 
        gasArray.setMessage(singleData); 
        if (gasArray.isBusy()) 
        { 
         gasArray.setProcessing(); 
         while (gasArray.isProcessing()) 
         { 
          continue; 
         } 
        } 
        else 
         gasArray.appendChat("Incoming data: " + singleData); 
       } 
     } 

還有另一個工作線程處理輸入數據並做一些操作,這不是一個同步問題或類似的東西。這歸結爲要麼得到一個太多,要麼一個到幾個字節,這導致我的線程計數的字節卡住,期待多一個字節。我已經使用RealTerm(一個串行控制檯程序)來檢索相同的東西,並且它每次都快速準確地完成。當添加一個BufferedInputStream時,事情似乎在case#2上工作得更好,但問題仍然偶爾發生。

我的問題是: 可用()方法真的不可靠導致這些問題?或者這是串行通信還是RXTX庫的問題? 有沒有更好的方法來處理這個問題?檢索2000個字節,處理它們,並要求另外2000個字節。 在串行端口上接收數據的速度是否是第一種?

任何想法與例子會有很大的幫助。

回答

0

在案例1中,您應該讀取一個字節數組並處理您獲得的所有數據。

可用()方法在99%的情況下用處不大,而且當從已經告訴您數據已準備好的輸入設備讀取數據時,可用()方法的用處不大。