我正在开发一个使用移动应用程序控制机器人的项目。到目前为止,我已设法发送蓝牙命令,使机器人按需要移动。但是我无法接收来自超声波传感器HC-SR04的输入,它每秒都会产生一个浮动谷。我已编写代码将float转换为字节然后将字节写入串行并读取并使用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);
任何想法我可能做错了什么?
答案 0 :(得分:0)
假设距离为d
d = 23.45454
其他编码信息是
encoded_d = struct.pack("f",d)
print repr(encoded_d) # '\xe6\xa2\xbbA'
所以当你在java中读取字符串时,你得到了......
由于这些字符不是有效字符,因此对于任何无效字符都会获得?
你需要弄清楚如何decode
回到java中的浮点数
解决这个问题最简单的方法就是将其发送为ascii
d = 23.45454
ser.write(str(d))
这将使你的消息传递速度略慢但除非它实际上是一个问题,它应该足够了
这篇文章中的所有代码都是python