【发布时间】:2016-01-18 17:32:33
【问题描述】:
我正在尝试从 LM92 读取温度数据。一切都很好,直到温度低于 0,然后我得到不好的结果。我知道问题在于将带符号位的 12 位整数转换为 Linux int 值,但我一直无法找到有关执行此操作的信息。我有一些适用于 Arduino 和 Microchip 的示例,但不适用于 Linux GCC。
这是一个适用于 Linux 以外的任何设备的示例:
// LM92 Read
int i2c_lm92Read() {
unsigned int data;
data = (unsigned int) i2c_read(0x4B);
data <<= 8;
data |= (unsigned int) i2c_read(0x4B);
data /= 8;
return (int) (data * 0.0625);
}
我用冷冻喷雾击中 LM92 时得到的结果:
LM92: 18C
LM92: 16C
LM92: 16C
LM92: 507C
LM92: 477C
LM92: 475C
【问题讨论】:
-
我在收集缓冲区数据的方式上发现了一个问题。我现在可以使用此代码。仍然不确定 Linux 如何设置符号位,所以我只是从原始数据中获取它,然后将结果乘以 1 或 -1。如果 (buf[0] & 0b00010000) 符号 = -1; buf[0] &= 0b1111;数据 = buf[0];数据 >= 3;数据 *= 0.0625;返回(int)数据*符号;