我在從微控制器檢索數據時遇到了一些困難。我以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個字節。 在串行端口上接收數據的速度是否是第一種?
任何想法與例子會有很大的幫助。