0

好吧,我在这里变得绝望了。我一直在寻找这个问题的答案,现在持续了 4 个小时,但没有运气。这是我正在做的事情的要点。我有一个通过套接字连接到另一台设备的 android 应用程序。我的输出流工作正常(连接的设备可以正确接收我发送的字节值 - 所以如果我向设备发送 10,它会看到 10)。另一方面,我的应用程序在向设备发送命令时接收输入。设备看到命令并发送回一个结构为 [DOUBLE+EOL] 的数据包。EOL 特别是 0x0A - '\n'。

我能够毫不费力地使用python进行此操作。但是,我是 Java 新手,还没有完全弄清楚这一点。我已经尝试了很多东西,现在正在使用DataInputStream(socket.getInputStream()). 我尝试使用 BufferedReader 但我无法将字符串转换为我想要的双精度。这是我试图开始工作的重要通信代码:

if ( send_command( 40 ) )
{
    try {
        final double left_servo_pos = input_stream.readDouble();
        try {
            left_servo_pos_view.setText( Double.toString( left_servo_pos ) );
        } catch ( Throwable t ) {
            left_servo_pos_view.setText( t.toString() );
        }
    } catch ( UnknownHostException e ) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch ( IOException e ) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

命令“40”只是告诉设备发送上面指定格式的数据包。catch ( Throwable t )在我弄清楚我正在使用什么之前,这只是一个替身(因此我可能会遇到什么样的错误 - 最初这在我尝试使用时捕获了转换类型错误 Double.parseDouble() )。

那么,现在发生了什么?我的TextView“left_servo_pos_view”中显示了许多不同的值。它们都以“e-312”周围的东西结束,这告诉我 .readDouble() 方法只是在它通过时抓取流的一部分(所以它获取了我发送的实际 Double 值的一部分,而不是整件事情)。

这就是我的问题。我可以根据需要提供其他详细信息(我不确定还有什么对您有帮助)。正如我所说,除了这部分之外,一切似乎都在工作(这就是为什么我没有提供初始化代码或其他任何类似设置通信的函数的原因)。我可以将 input_stream 类型更改为任何必要的类型(就像我说的那样,我尝试了 BufferedReader,但运气不佳,现在我回到了 DataInputStream。

谢谢!

编辑:

我最终以与我预期完全不同的方式解决了这个问题。在对控制器的输出进行数据包捕获后,结果发现数据以“小端”风格出现(仍然不确定为什么,猜测这就是控制器实现它的方式)。所以,我在网上找到了一个 Little Endian InputStream 类,我实现并几乎解决了这个问题。第一个值是正确的,然后它需要 8 个以上的值才能再次正确。所以,我认为数据包中缺少一些东西,经过仔细检查,最后有一个额外的字节“00”。所以,我在我的代码中添加了“skipBytes(1)”,它现在可以正常工作了。

4

1 回答 1

1

要么您没有发送双份,要么您与发件人不同步。我认为不需要尾随 \n。我也看不到您在哪里使用它,这当然会使您与发件人不同步。我会仔细检查您是否使用 DataOutputStream.writeDouble() 发送双精度,并从协议中完全删除 \n。

于 2012-09-11T00:32:56.650 回答