好吧,我在这里绝望了。我一直在寻找这个问题的答案,现在进行了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)”,现在它正常工作。
答案 0 :(得分:1)
要么您没有发送双重内容,要么与发件人不同步。我没有看到任何需要尾随\ n。我也不知道你在哪里消费它,当然使你你与发件人不同步。我会仔细检查你是否正在使用DataOutputStream.writeDouble()发送double,并从协议中完全删除\ n。