我在从微控制器检索数据时遇到了一些困难。我以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个字节。 在串行端口上接收数据的速度是否是第一种?
任何想法与例子会有很大的帮助。