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

时间:2014-05-20 13:23:49

标签: java linux serial-port rxtx

我有一个代码,通过连接到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

有什么想法吗? 谢谢你提前!

1 个答案:

答案 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错误的情况下。

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