我试着不断地从stm32wb55向我自己的安卓应用发送传感器数据。我从加速度传感器接收两个字节,并在我的浮点数上将它们正确地转换为具有格式的浮点数(XX.XXXXX,stm32wb55可以是负数)。
现在我想把这个float发送给我自己的android应用程序。
以前,我已经将两个字节从类型"int or uint“发送到我的android应用程序,并尝试像我在stm32wb55上所做的那样转换它们。但我屏幕上的值在50%的情况下是假的。所以现在我尝试直接发送浮点值,这样就不需要在我的手机上进行更多的转换。
编辑:在你的贡献之后,我已经忘记了给我的android应用程序发送一个float的糟糕想法。我再次尝试发送两个字节的整数,并在我的应用程序上以正确的方式转换它们。现在它的工作方式应该是这样的。我在这篇文章中找到了我需要的解决方案:2 Chars to Short in C。通过将两个字节组合成一个16位整数,我只需要为我的LSB使用0x00ff &,就像在参考帖子的答案中使用的一样。
发布于 2021-01-29 18:46:50
使用format将浮点数转换为
(XX.XXXXX,float可以为负)。
这是不可能的。
浮点数是一个32位的IEEE754浮点数。显然,它们的工作方式并不像你(显然)认为的那样。
具体地说,它们是具有尾数系统的二进制结构。我将尝试解释为什么它不像你认为的那样工作:小数形式的1/3是多少?你会发现无论你用多少位(数字),你都不能写成十进制。你永远不会完全理解它。总是有另外3个要加。
浮点数的工作方式相同,但它是二进制(基数为2),而不是十进制(基数为10)。这意味着有一些数字在十进制中工作得很好(例如,十进制中的1/10是0.1,非常精确),但它们在二进制中就像1/3 :无论你使用多少位,你永远也得不到它。
这是另一种思考方式:32位,因此,只有2^32 (大约40亿)个不同的值。换句话说,在所有存在的数字中(它们有无限的无穷大:有无限的数字,在任何2个连续的数字中,另一个无限的数字),最多只有40亿是有福的:40亿的所有存在的数字可以用一个浮点值表示。如果你试图表示一个没有浮点数的数字,那么java /你的CPU只会将它舍入到最接近的有福数字,并且不会给你真正的机会来处理错误(毕竟,你如何表示错误呢?它也不太可能是有福的)。
那么,比如说,'12.34567'?这不是一个神圣的数字-因此,你的浮点数不可能代表它。相反,它将是一个非常接近它的数字,如果你将它四舍五入到5位数,它可能会舍入到12.34567。
将这个花车发送给我自己的安卓应用程序。
所以,不,你不会想这么做的。你想要发送12.34567到你的安卓应用,而不是代表它的32位。除非你打算让应用程序的android端进行舍入,而你可能应该这样做。请注意,我打赌有一些符合'XX.YYYYY‘模式的数字并不像浮点数那样’工作‘(它们四舍五入,这样你就差了1)。如果这是一个问题,不要使用浮点数(使用双精度,我怀疑你是否会找到一个没有幸福数字的XX.YYYYY,因为它有更多的位要处理,或者使用字符串,或者使用2个整数,或者使用单个整数,并且双方都知道整数1234567表示12.34567)。
最后一个听起来像是您在这里最方便的技巧,但很难说清楚,因为您没有提供太多细节。
类似于(但请注意,浮动可能会减少1左右!):
发送方:
double v = theFloat; // doubles have less error
int z = (int) (v * 100000);
sendToPhone(z);接收器端:
int z = getFromDevice();
double v = z;
v /= 100000;
float theFloat = (float) v;上面的代码会自动舍入(对于正数来说是向下舍入,对于负数来说是向上舍入),并且可以处理超过5位的浮点数),并且可以处理到正负21473.99999的数字。听起来这很容易满足你的需求。
注:你必须为你的stm32wb55编写“乘以100000,然后转换成int32”代码,如果stm32wb55是用java编写的,上面的代码就是这样写的,我假设它不是这样的。“乘以100000之前转到两倍”可能是一个无关紧要的优化,如果你做不到这一点,我也不会太担心。请注意,CPU不能保证对浮点数/双精度数使用与java完全相同的IEEE754表示,这就是为什么您绝对不应该尝试通过蓝牙通道将值作为浮点数/双精度值发送,而是作为普遍认可的东西发送,例如“2的补码32位整数值”。
https://stackoverflow.com/questions/65952711
复制相似问题