我有一个代码,通过连接到PC上其中一个USB接口的虚拟串行端口向中继板发送命令,并读取响应。
语法:
发送:
command\r
响应:
command\r
answer\r
>
在我的开发PC上,它运行正常。 (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
有什么想法吗? 谢谢你提前!
答案 0 :(得分:0)
这可能是一个时间问题。您有一个Thread.sleep(100)
,但这不是很安全,除非您知道完整的响应将始终在100毫秒内可用。 in.available()可能会在您预期之前返回0,因为尚未发送完整响应,即使您已阅读其中的第一部分。
另一种选择可能是:
do
{
data = in.read();
if ( (char) data == '>') {
break;
}
buffer[len++] = (byte) data;
}
while(data != -1);
如果没有数据或您的回复永远不会返回'>',这将无限期阻止。根据您的设备协议,这可能是安全确保您已阅读所有内容的唯一方法。但理想情况下,您可以准确计算出您希望接收的字节数,然后执行readFully或类似操作。
请注意,可以配置Rxtx以便不阻止读取,在这种情况下,您必须以不同方式对其进行编码。 (并且某些旧版本的rxtx有一个错误,无论配置如何,读取都不会阻塞。)
你应该在catch处理程序中输出异常stacktrace,如果你还没有,只是在发生IO错误的情况下。
此外,根据您的代码,您的输出将永远不会包含'>'输出中的字符。只是澄清一下,因为你声明它在你的问题中做了。