2012-05-27 32 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%的情况下用处不大,而且当从已经告诉您数据已准备好的输入设备读取数据时,可用()方法的用处不大。