0

我通过 I2C 和 STM32 逐字节读取 16 位二进制补码传感器数据,因此我必须将高字节和低字节粘在一起并将这个数字转换为浮点数以获得实际值。
我在 C 中的表达是

// Convert temperature value (256 LSBs/°C with +25°C Offset)
float temp = (tmpData[1] << 8 | tmpData[0])/256.0 + 25.0;   

当我使用 STM32CubeIDE 的调试器检查计算时,表达式显示数据的正确转换(见截图)。但是分配给 temp 变量的值始终是 25!在我看来,表达式的第一项总是被假定为 0 还是什么?我已经尝试将括号中的术语直接转换为浮动,但这并没有改变任何东西。

谁能指出我的问题?为什么调试器显示正确的值,但代码分配了错误的值?


以下屏幕截图中的表达式是通过在调试模式下将鼠标悬停在上述代码行的相应部分上来捕获的。

图 1:计算的完整表达式(给出预期的结果) 在此处输入图像描述

图 2:tmpData 内容(原两个 Bytes) 在此处输入图像描述

图 3:字节移位和粘贴的结果 在此处输入图像描述

图 4:临时结果(始终为 25,即使上面的表达式显示了预期值) 在此处输入图像描述

temp目前只是一个 volatile,因为我还没有使用那个值,编译器会优化它。

4

2 回答 2

0

这行代码中有很多问题。

  1. tmpData[1] << 8必须是(((uint16_t)tmpData[1]) << 8)。如果将字节移位 8 次,结果将为零(标准表示未定义)。你可能收到了关于它的警告。

  2. 256.0 和 25.0 是double值,结果也将double转换为float. 你应该使用 256.0f 和 25.0f。

你可以在这里看到不同之处:https ://godbolt.org/z/Cm-S8T

于 2020-05-12T11:09:41.053 回答
0

好的,新的早晨,新的直觉……

问题不在于问题中的此代码行,而是(典型的墨菲)与我没有发布的内容有关。I2C 通过 DMA 读取到阵列中,而在我想要进行转换的时候,外围设备还没有完成。这就是为什么当代码访问它们时数组元素总是空的,但是当我检查调试器中的值时,I2C 外围设备已经完成了传输并且我看到了预期的值。

所以解决办法是检查外设是否还在忙...

于 2020-05-13T06:48:06.637 回答