我正在使用java comm库来尝试对串口进行简单的读/写操作。我能够成功写入端口,并从输入流中捕获返回输入,但是当我从输入流中读取时,我只能读取1个字节(当我知道应该返回11个时)
我可以使用Putty成功写入端口,并在那里收到正确的返回String。我对Java,缓冲区和串行i / o都很陌生,并认为可能有一些明显的语法或理解如何将数据返回到InputStream。有人能帮助我吗?谢谢!
case SerialPortEvent.DATA_AVAILABLE:
System.out.println("Data available..");
byte[] readBuffer = new byte[11];
try {
System.out.println("We trying here.");
while (inputStream.available() > 0) {
int numBytes = inputStream.read(readBuffer, 1, 11);
System.out.println("Number of bytes read:" + numBytes);
}
System.out.println(new String(readBuffer));
} catch (IOException e) {System.out.println(e);}
break;
}
此代码返回以下输出:
Data available..
We trying here.
Number of bytes read:1
U
答案 0 :(得分:1)
将输入流中最多len个字节的数据读入一个字节数组。尝试读取len个字节,但可以读取较小的数字。
这种行为完全合法。我还希望SerialPortEvent.DATA_AVAILABLE
不能保证所有数据都可用。它可能只有1个字节,你可以11次获得该事件。
你可以尝试的事情:
1)继续阅读,直到你拥有所有字节。例如。将InputStream
打包成DataInputStream
并使用readFully
,这是常规read
方法行为的最简单方法。如果InputStream不提供任何更多字节并且信号流结束,则可能会失败。
DataInputStream din = new DataInputStream(in);
byte[] buffer = new byte[11];
din.readFully(buffer);
// either results in an exception or 11 bytes read
2)在他们来时读取它们并将它们附加到缓冲区。一旦你拥有了所有这些,就会得到缓冲区的上下文。
private StringBuilder readBuffer = new StringBuilder();
public void handleDataAvailable(InputStream in) throws IOException {
int value;
// reading just one at a time
while ((value = in.read()) != -1) {
readBuffer.append((char) value);
}
}
一些注意事项:
inputStream.read(readBuffer, 1, 11)
指数从0开始,如果要将11个字节读入该缓冲区,则必须指定
inputStream.read(readBuffer, 0, 11)
否则会尝试将第11个字节放在第12个索引处,这将无效。