我在从微控制器检索数据时遇到了一些困难。我正在以正好 2000 字节的块传输数据,并编写了一个线程来处理这 2000 字节,然后再进行新的调用以发送下一个 2k 字节。在大多数情况下,它工作得很好,但有时我倾向于得到一个字节太多,或者由于某种原因一个字节太少,这仅在case #2期间。如果我使用案例#1,它总是完美无缺,但由于某种原因它非常慢。我们在 10 秒内谈论了大约 2000 个字节,当我将串行端口设置为以 115.200 波特工作时,这太慢了。
案例#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 时,情况 #2的情况似乎更好一些,但问题仍然偶尔发生。
我的问题是:available() 方法真的不可靠会导致这些问题吗?或者这是串行通信或 RXTX 库的问题?有没有更好的方法来处理这个?检索 2000 个字节,处理它们,然后再请求 2000 个字节。#1 案例在串行端口上接收数据是否应该这么慢?
任何带有示例的想法都会有很大帮助。