0

这是我的代码,我正在使用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;
    }

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

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

4

2 回答 2

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 提醒我保持帖子的质量并确保它们是正确的。

于 2012-08-04T04:05:01.200 回答
1

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

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

于 2012-08-04T04:06:55.130 回答