请问各位,如下代码a值输出一直为零,没有计算结果是什么原因啊?下面为源代码片段,是Arduino读取I2C输出的14位数据,通过计算得出角度值
b = (i << 6) | n; //输出14位二进制数据,将寄存器地址0x03读取到的八位数据左移6位,与0x04寄存器读取到的6位数据相与。
int y = b;
int a = (y/16384)*360;
Serial.println(a);
Serial.println(b);
b的值输出正常,但是a输出一直为零
请问各位,如下代码a值输出一直为零,没有计算结果是什么原因啊?下面为源代码片段,是Arduino读取I2C输出的14位数据,通过计算得出角度值
b = (i << 6) | n; //输出14位二进制数据,将寄存器地址0x03读取到的八位数据左移6位,与0x04寄存器读取到的6位数据相与。
int y = b;
int a = (y/16384)*360;
Serial.println(a);
Serial.println(b);
b的值输出正常,但是a输出一直为零
关注让【道友老李】来帮你解答,本回答参考通义千问大模型编写,并整理提供,如果还有疑问可以点击头像关注私信或评论。
如果答案让您满意,请采纳、关注,非常感谢!根据你提供的代码片段,问题出在计算角度值 `a` 的公式上。具体来说,由于整数除法的特性,在进行 `y/16384` 时,如果 `y` 小于 16384,则结果会是 0(因为任何小于 16384 的正整数除以 16384 都会得到 0)。然后乘以 360 仍然为 0。这解释了为什么 `a` 的输出一直为零。
要解决这个问题,你可以使用浮点数来进行除法运算,这样即使 y 小于 16384,也可以得到一个非零的小数值。之后再将结果转换为整数或保留小数位数。
#include <Wire.h>
void setup() {
Serial.begin(9600);
Wire.begin();
}
void loop() {
int i, n;
// 假设这里已经通过I2C读取到了i和n的值
// 例如: Wire.requestFrom(0x53, 2); // 从I2C地址0x53读取2个字节
// if (Wire.available()) { i = Wire.read(); n = Wire.read(); }
int16_t b = (i << 6) | (n & 0x3F); // 输出14位二进制数据
int y = b;
// 使用浮点数进行除法运算
float a = (float)y / 16384.0 * 360.0;
Serial.print("b: ");
Serial.println(b);
Serial.print("a: ");
Serial.println(a);
delay(1000); // 每秒更新一次
}
b 声明为 int16_t,确保它可以存储14位的数据。y 转换为 float 类型进行除法运算,确保可以得到小数值。b 和 a 的值,以便观察结果。假设 i 和 n 的值分别为 0x12 和 0x34: - i 的值为 18(0x12) - n 的值为 52(0x34)
计算过程如下: - b = (18 << 6) | (52 & 0x3F) = 1152 | 52 = 1204 - y = 1204 - a = (float)1204 / 16384.0 * 360.0 ≈ 26.25
最终输出:
b: 1204
a: 26.25
这样就可以正确计算并输出角度值 a 了。