Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过蓝牙低能耗将类型为%8.5f的浮点值以两个字节的形式发送到我的android应用程序_Java_Android_C_Stm32 - Fatal编程技术网

Java 如何通过蓝牙低能耗将类型为%8.5f的浮点值以两个字节的形式发送到我的android应用程序

Java 如何通过蓝牙低能耗将类型为%8.5f的浮点值以两个字节的形式发送到我的android应用程序,java,android,c,stm32,Java,Android,C,Stm32,我尝试将传感器数据从stm32wb55连续发送到我自己的android应用程序。 我从加速度传感器接收到两个字节,并将stm32wb55上的字节正确转换为具有格式的浮点(XX.XXXXX,浮点可以是负数) 现在我想把这个浮点数发送到我自己的android应用程序 之前,我已经将两个字节从类型“int或uint”发送到我的android应用程序,并尝试以与我在stm32wb55上已经完成的相同方式转换这些字节。但是我的屏幕上的值有高达50%的情况是错误的。所以现在我尝试直接发送浮点值,这样就不需要

我尝试将传感器数据从stm32wb55连续发送到我自己的android应用程序。 我从加速度传感器接收到两个字节,并将stm32wb55上的字节正确转换为具有格式的浮点(XX.XXXXX,浮点可以是负数)

现在我想把这个浮点数发送到我自己的android应用程序

之前,我已经将两个字节从类型“int或uint”发送到我的android应用程序,并尝试以与我在stm32wb55上已经完成的相同方式转换这些字节。但是我的屏幕上的值有高达50%的情况是错误的。所以现在我尝试直接发送浮点值,这样就不需要在手机上进行更多的转换


编辑:在你的贡献之后,我忘记了我的拙劣想法,即向我的android应用程序发送一个浮动。我再次尝试发送两个字节的整数,并在我的应用程序上正确地转换它们。现在它应该如何工作。我在这篇文章中找到了我需要的解决方案:。 通过将两个字节组合成一个16位整数,我只需要为我的LSB使用
0x00ff&
,就像在引用文章的答案中使用它一样

到格式为(XX.XXXXX,浮点可以为负数)的浮点

这是不可能的

浮点数是32位IEEE754浮点数他们不像你(显然)认为的那样工作

具体来说,它们是具有尾数系统的二进制构造。我将试着解释为什么它不能像你想象的那样工作:十进制的1/3是多少?你会发现,无论你使用多少位(数字),你都不能用十进制来写。你永远不会完全明白的。总有另外3个需要添加

浮点数的工作原理相同,但它是二进制的(以2为基数),而不是十进制的(以10为基数)。这意味着有些数字在十进制中非常有效(比如1/10,在十进制中是0.1,具有完美的精度),但在二进制中是1/3:无论你使用多少位,你永远都不会得到它

这里有另一种思考方式:32位,因此,只有2^32(约40亿)个不同的值。换句话说,在所有存在的数字中(有无限多个:有无限多个数字,在任何两个连续的数字中,又有无限多个数字),最多只有40亿是幸运的:存在的所有数字中有40亿可用浮点数表示。如果您试图表示一个没有浮点数的数字,那么java/您的CPU只会将其四舍五入到最接近的浮点数,并且不会给您真正的机会来处理错误(毕竟,您将如何表示错误?也不太可能有浮点数)

那么,说‘12.34567’?这不是一个幸运的数字-因此,你的浮动不可能代表这一点。相反,它将是一个非常接近它的数字,如果你将它四舍五入到5位,它可能会四舍五入到12.34567

将此浮动发送到我自己的android应用程序

所以,不,你不想这么做。你想将12.34567发送到你的android应用程序,而不是代表它的32位。除非你打算让应用程序的android端进行取整,你可能应该这样做。请注意,我打赌有一些数字符合'XX.yyyy'模式,但它们不能作为浮点数'工作'(它们四舍五入,这样你就可以用1来表示)。如果这是一个问题,请不要使用浮点数(使用双精度浮点数,我怀疑您是否会发现XX.yyyy没有一个幸运的数字,因为它有更多的位可以使用,或者使用一个字符串,或者使用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.9999的数字。听起来这很容易满足你的需要


注意:您必须为stm32wb55编写“乘以100000,然后转换为int32”代码,如果stm32wb55是用java编程的,那么上面就是您编写代码的方式,我认为它不是。“在乘以100000之前加倍”可能是一个无关紧要的优化,如果你不能做到这一点,我也不会太担心。请注意,CPU不能保证使用与java完全相同的IEEE754浮点数/双精度表示,这就是为什么您绝对不应该尝试通过蓝牙通道以浮点数/双精度的形式发送值,而是作为普遍同意的方式发送值,比如“A 2的补码32位整数值”。

你是否考虑在两边共享相关代码?和我在STM32 WB55上已经做过的一样:你需要显示你的代码的相关部分。否则,我们唯一能说的是:您在没有显示的代码中犯了错误。但是无论如何,只使用2个字节发送一个需要4个字节的浮点似乎是不可能的。还有什么是
%8.5f
类型?这看起来像printf函数族的格式说明符。你真的需要澄清你的问题。在阅读此文之前:
现在我想把这个float发送到我自己的android应用程序。
现在还不清楚你想发送什么。如果你想发送“12.34567”,那就是文本。如果你想发送一个浮点变量,那么这个变量肯定由四个字节组成,因此你会发送这四个字节。请详细说明。(在您的帖子中。评论是给我们的)。
我收到了来自加速度传感器的两个字节
最好转发这两个字节,您就完成了。非常感谢您的详细解释!我相信这对我将来会有更大的帮助。为了记录在案,可以发送一个浮动的