这是我的代码,我正在使用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
答案 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作为第三个参数。