繁体   English   中英

输入流仅返回1个字节

[英]Input Stream only returning 1 byte

我正在使用java comm库来尝试完成对串行端口的简单读取/写入。 我能够成功写入端口,并从输入流中捕获返回输入,但是当我从输入流中读取时,我只能读取1个字节(当我知道应该返回11个字节时)

我可以使用Putty成功写入端口,并在那里收到正确的返回字符串。 我对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

文档所述

从输入流中读取最多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个索引处,这将不起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM