0

STM32 を使用して I2C 経由で 16 ビットの 2 の補数センサー データをバイトごとに読み取るため、上位バイトと下位バイトを一緒に貼り付け、この数値を浮動小数点数に変換して実際の値を取得する必要があります。
これに対する私の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 の内容 (元の 2 バイト) ここに画像の説明を入力

図 3: バイトシフトとスティッキングの結果 ここに画像の説明を入力

図 4: 一時的な結果 (上記の式が期待値を示している場合でも、常に 25) ここに画像の説明を入力

tempは現時点では揮発性にすぎません。これは、その値をまだ使用しておらず、コンパイラが最適化するためです。

4

2 に答える 2