通过蓝牙从Raspberry Pi(使用python)向java android应用程序发送字节

通过蓝牙从Raspberry Pi(使用python)向java android应用程序发送字节,java,android,python,raspberry-pi,Java,Android,Python,Raspberry Pi,我正在做一个用移动应用程序控制机器人的项目。到目前为止,我已经成功地发送了蓝牙命令,让机器人按需要移动。但我在接收超声波传感器HC-SR04的输入时遇到问题,该传感器每秒都会给出一个浮动值。我已经编写了将浮点转换为字节的代码,然后将字节写入串行,并使用java在textview上读取和显示它们。 但是我在textview上只得到了一个问号,我假设它表明我能够在通道上接收数据,要么字节不完整,要么转换错误 请帮忙 ##########下面是我发送字节的python脚本 while True:

我正在做一个用移动应用程序控制机器人的项目。到目前为止,我已经成功地发送了蓝牙命令,让机器人按需要移动。但我在接收超声波传感器HC-SR04的输入时遇到问题,该传感器每秒都会给出一个浮动值。我已经编写了将浮点转换为字节的代码,然后将字节写入串行,并使用java在textview上读取和显示它们。 但是我在textview上只得到了一个问号,我假设它表明我能够在通道上接收数据,要么字节不完整,要么转换错误

请帮忙

##########下面是我发送字节的python脚本
while True:
        a = ser.read()  #read from the serial  port
        ser.close()
        dist = initio.getDistance()    #distance obtained from ultra sensor       
        d = int(a.encode('hex'), 16) 
        bytSend = struct.pack('f', dist)  #convert the int distance to bytes
        ser.open()
        ser.write(bytSend)
**********下面是java代码,用于读取流上的数据并发送到主代码上的处理程序***************

public void run() {
            byte[] buffer = new byte[1024];
            int bytes;
            // Keep listening to the InputStream while connected
            while (true) {
                try {
                    // Read from the InputStream
                    bytes = mmInStream.read(buffer);
                    // Send the obtained bytes to the UI Activity

                    mHandler.obtainMessage(initioActivity.MESSAGE_READ, bytes, -1, buffer)
                            .sendToTarget();

                } catch (IOException e) {
                    //
                    connectionLost();
                    break;
                }
            }
        }
*****然后在我的主代码(在处理程序中)中***

case MESSAGE_READ:
                //byte[] readBuf = (byte[]) msg.obj;
                byte[] readBuf = (byte[]) msg.obj;
                //construct a string from valid bytes in buffer
                String distance = new String(readBuf, 0, msg.arg1);
                myLabel.setText(distance);
知道我做错了什么吗?

假设距离为d

d = 23.45454
因此编码的消息是

encoded_d = struct.pack("f",d)
print repr(encoded_d) # '\xe6\xa2\xbbA'
因此,当您在java中读取字符串时,您会发现。。。 因为这些都是无效字符,所以对于任何无效字符都会得到

您需要弄清楚如何在java中将其解码回浮点

要解决这个问题,最简单的方法可能是将其作为ascii发送

d = 23.45454
ser.write(str(d))
这将使您的消息传递稍微慢一点,但除非它实际上是一个问题,否则它应该足够了


本文中的所有代码都是python

谢谢您的回复Joran。我将研究如何将其解码回java中的float。关于你建议的解决方案,它不起作用,我甚至尝试了你上面给出的确切例子。我还可以吗?在我的应用程序上,还是我也必须对其进行更改?不,您不应该对客户端代码进行更改。。。(但我对java不是很在行,所以也许你需要告诉它将其解码为ascii字符串或其他东西)好的,我已经尝试过不同的编码方式,但还没有成功。尝试了“UTF-8”和“US-ASCII”,但不受支持。至少这给了我一些东西,虽然我不知道如何解释。。。字节[]readBuf=(字节[])msg.obj;字符串距离=Arrays.toString(readBuf);myLabel.setText(距离);这个givess只是得到[-8,0,0,0,0,0,0,0,0,0,0,0………我不知道它是什么意思