RXTX java,inputStream不返回所有缓冲区

时间:2012-08-04 01:50:23

标签: java serial-port rxtx

这是我的代码,我正在使用rxtx

public void Send(byte[] bytDatos) throws IOException {
        this.out.write(bytDatos);
    }

    public byte[] Read() throws IOException {

        byte[] buffer = new byte[1024];

        int len = 20;

        while(in.available()!=0){
            in.read(buffer);
        }

        System.out.print(new String(buffer, 0, len) + "\n");

        return buffer;
    }

其余代码与this相同,我只更改了2件事。

InputStream in = serialPort.getInputStream();
OutputStream out = serialPort.getOutputStream();

它们现在是全局变量而且......

(new Thread(new SerialReader(in))).start();
(new Thread(new SerialWriter(out))).start();

现在不存在......

我发送这个(每秒)

Send(("123456789").getBytes());

这就是我得到的:

123456789123
456789
123456789
1234567891
23456789

任何人都可以帮助我吗?

修改

后来,我得到了解决问题的更好方法。谢谢,这是读取代码

public byte[] Read(int intEspera) throws IOException {

        try {
            Thread.sleep(intEspera);
        } catch (InterruptedException ex) {
            Logger.getLogger(COM_ClComunica.class.getName()).log(Level.SEVERE, null, ex);
        }//*/

        byte[] buffer = new byte[528];

        int len = 0;


        while (in.available() > 0) {
            len = in.available();
            in.read(buffer,0,528);
        }

        return buffer;
    }

对我来说,擦除睡眠是不可能的,但这不是问题所以,谢谢veer

2 个答案:

答案 0 :(得分:1)

您确实应该注意InputStream.available定义如下......

  

返回此输入流可以读取(或跳过)的字节数的估计值,而不会在下次调用此输入流的方法时阻塞。下一次调用可能是同一个线程或另一个线程。单个读取或跳过这么多字节不会阻塞,但可以读取或跳过更少的字节。

如您所见,这不是您所期望的。相反,您要检查流末尾,InputStream.read()返回-1表示。

此外,由于您不记得在读取循环的先前迭代中已经读取了多少数据,因此您可能会覆盖缓冲区中的先前数据,这也不是您可能想要的。

您想要的内容如下:

private static final int MESSAGE_SIZE = 20;

public byte[] read() throws IOException {
  final byte[] buffer = new byte[MESSAGE_SIZE];
  int total = 0;
  int read = 0;
  while (total < MESSAGE_SIZE
            && (read = in.read(buffer, total, MESSAGE_SIZE - total)) >= 0) {
    total += read;
  }
  return buffer;
}

这应该强制它读取最多 20个字节,在到达流的末尾时更少。

特别感谢EJP提醒我保持帖子的质量,并确保它们是正确的。

答案 1 :(得分:1)

摆脱available()测试。它所做的一切就是告诉你是否有数据可以在不阻塞的情况下读取这与告诉你整个消息的结束位置是一回事。 available(),几乎没有正确的用途,这不是其中之一。

读取时推进缓冲区指针。您需要跟踪到目前为止已读取的字节数,并将其用作read()的第二个参数,并将buffer.length作为第三个参数。