Java RXTX读取响应太短-can';t接收客户端已回复的所有字节
我有一个代码,它通过连接到PC上的一个USB接口的虚拟串行端口向中继板发送命令,并读取响应 语法: 发送: 答复:Java RXTX读取响应太短-can';t接收客户端已回复的所有字节,java,linux,serial-port,rxtx,Java,Linux,Serial Port,Rxtx,我有一个代码,它通过连接到PC上的一个USB接口的虚拟串行端口向中继板发送命令,并读取响应 语法: 发送: 答复: command\r answer\r > 在我的开发PC上,它运行良好。(Lubuntu 13.10),但在目标PC(Lubuntu 12.04 LTS)上,它只读取我发送的命令。例如: 发送: 正确的响应(在我的开发环境中,它的工作原理如下): 它也适用于其他机器。但是,不幸的是,在我想为之开发的PC上,响应如下: gpio read 0 在这里,流结束时没有真正的响应
command\r
answer\r
>
在我的开发PC上,它运行良好。(Lubuntu 13.10),但在目标PC(Lubuntu 12.04 LTS)上,它只读取我发送的命令。例如:
发送:
正确的响应(在我的开发环境中,它的工作原理如下):
它也适用于其他机器。但是,不幸的是,在我想为之开发的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
有什么想法吗?
谢谢你的进步 可能是时间问题。您有一个
线程。sleep(100)
,但这不是很安全,除非您知道完全响应总是在100ms内可用。有可能在您预期之前返回0,因为尚未发送完整响应,即使您已经阅读了响应的第一部分
另一种选择是:
do
{
data = in.read();
if ( (char) data == '>') {
break;
}
buffer[len++] = (byte) data;
}
while(data != -1);
如果没有数据或您的响应从未返回“>”,则此操作将无限期阻止。根据您的设备协议,这可能是确保您已阅读所有内容的唯一安全方法。不过,理想情况下,您可以准确计算希望接收的字节数,然后进行简单或类似的计算
请注意,可以对Rxtx进行配置,以便读取不会阻塞,在这种情况下,您必须以不同的方式编写代码。(某些旧版本的rxtx有一个bug,无论配置如何,读取都不会阻塞。)
如果还没有,您应该在catch处理程序中输出异常stacktrace,以防发生IO错误
另外,根据您的代码,您的输出永远不会在输出中包含'>'字符。只是澄清一下,因为你在你的问题中说明了这一点。你得到了答案的一半。另一件我遗漏的事情是,设备接受一个LF-CR(而不是CR或CR-LF)序列作为命令分隔符,因此我必须手动发送它。谢谢你的帮助!
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
do
{
data = in.read();
if ( (char) data == '>') {
break;
}
buffer[len++] = (byte) data;
}
while(data != -1);