gpt4 book ai didi

java - RXTX 读取响应太短 - 无法接收客户端回复的所有字节

转载 作者:太空宇宙 更新时间:2023-11-04 03:58:52 24 4
gpt4 key购买 nike

我有一段代码,可以通过连接到 PC 上 USB 连接器之一的虚拟串行端口向继电器板发送命令,并读取响应。

语法:

发送:

command\r

回复:

command\r
answer\r
>

在我的开发电脑上,它运行良好。 (Lubuntu 13.10)但在目标 PC(Lubuntu 12.04 LTS)上它只读取我发送的命令。例如:

发送:

gpio read 0\r

正确的响应(在我的开发环境上它的工作原理如下):

gpio read 0\r
1\r
>

它在其他机器上也能很好地工作。但是,不幸的是,在我想要开发的 PC 上,响应如下:

gpio read 0

这里流结束而没有真正的响应。

我的代码是:

public static String command(String command) throws Exception  {
byte[] buffer = new byte[1024];
int len = 0;
out.flush();
try{
out.write(command.getBytes());
out.write('\r');
out.flush();
int data;
Thread.sleep(100);
while (in.available() > 0)
{
data = in.read();
if ( (char) data == '>') {
break;
}
buffer[len++] = (byte) data;
}


} catch (IOException ex){
}
return new String(buffer);
}

一些可能有用的参数:

开发机器:

kernel: 3.11.0-12 generic
java version: 1.7.0_51 OpenJDK IcedTea 2.4.4, 7u51-2.4.4-0ubuntu0.13.10.1

目标机器:

kernel 3.7.1-030701-generic
java version: 1.7.0_55 OpenJDK IcedTea 2.4.7, 7u55-2.4.7-1ubuntu1~0.12.04.2

在这两种情况下我都使用 RXTX-2.2-pre2

有什么想法吗?感谢您的提前!

最佳答案

这可能是一个时间问题。您有一个 Thread.sleep(100),但这不是很安全,除非您知道完整响应始终会在 100 毫秒内可用。有可能in.available()在您预期之前返回 0,因为完整的响应尚未发送,即使您已经阅读了它的第一部分。

替代方案可能是这样的:

    do
{
data = in.read();
if ( (char) data == '>') {
break;
}
buffer[len++] = (byte) data;
}
while(data != -1);

如果没有数据或者您的响应永远不会返回“>”,这将无限期地阻塞。根据您的设备协议(protocol),这可能是安全地确保您已阅读所有内容的唯一方法。但理想情况下,您可以准确计算出您期望接收多少字节,然后执行 readFully 或类似操作。

请注意,可以配置 Rxtx,以便读取不会阻塞,在这种情况下,您必须以不同的方式进行编码。 (某些旧版本的 rxtx 有一个错误,无论配置如何,读取都不会阻塞。)

您应该在 catch 处理程序中输出异常堆栈跟踪(如果尚未输出),以防万一发生 IO 错误。

此外,根据您的代码,您的输出永远不会在输出中包含“>”字符。只是澄清一下,因为您在问题中声明了这一点。

关于java - RXTX 读取响应太短 - 无法接收客户端回复的所有字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23761079/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com