RXTX的问题 - 接收到大量的字节数

时间:2012-05-27 01:11:15

标签: java serial-port inputstream rxtx bufferedinputstream

我在从微控制器检索数据时遇到了一些困难。我正在以完全2000字节的块传输数据,并且在进行新的调用以发送下一个2k字节之前编写了一个线程来处理这2000个字节。在大多数情况下它工作得很好,但有时我倾向于得到一个字节太多,或者由于某种原因一个字节太少,这只是在情况#2 期间。如果我使用 case#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时,使用 case#2 似乎工作得更好,但问题仍然偶尔发生。

我的问题是: available()方法真的不可靠导致这些问题吗?或者这是串行通信或RXTX库的问题? 有没有更好的方法来处理这个?检索2000个字节,处理它们,并要求另外2000个字节。 在串口上接收数据时#1的情况应该是这么慢吗?

任何带有示例的想法都会有很大的帮助。

1 个答案:

答案 0 :(得分:0)

在案例1中,您应该读入一个字节数组并处理您获得的所有数据。

在99%的情况下,available()方法没有太大用处,当然,从已经告诉你数据准备就绪的输入设备中读取时肯定没有。