【问题标题】:Issues with RXTX - Erronous amount of bytes being receivedRXTX 问题 - 接收的字节数错误
【发布时间】:2012-06-02 00:18:34
【问题描述】:

我在从微控制器检索数据时遇到了一些困难。我正在以正好 2000 字节的块传输数据,并编写了一个线程来处理这 2000 字节,然后再进行新的调用以发送下一个 2k 字节。在大多数情况下它工作得很好,但有时我倾向于得到一个字节太多,或者由于某种原因一个字节太少,这仅在 case #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 案例在串口上接收数据的速度应该这么慢吗?

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

【问题讨论】:

    标签: java serial-port inputstream rxtx bufferedinputstream


    【解决方案1】:

    在第一种情况下,你应该读入一个字节数组并处理你得到的所有数据。

    available() 方法在 99% 的情况下都没有多大用处,当然在从已经告诉您数据已准备好的输入设备读取数据时更是如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多