Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java RXTX读取响应太短-can';t接收客户端已回复的所有字节_Java_Linux_Serial Port_Rxtx - Fatal编程技术网

Java RXTX读取响应太短-can';t接收客户端已回复的所有字节

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 在这里,流结束时没有真正的响应

我有一个代码,它通过连接到PC上的一个USB接口的虚拟串行端口向中继板发送命令,并读取响应

语法:

发送:

答复:

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);