如何在Linux中转换LM92的温度数据

时间:2016-01-18 17:32:33

标签: c linux integer signed

我正在尝试从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

1 个答案:

答案 0 :(得分:2)

尝试

data = (unsigned int) i2c_read(0x4B);   
data <<= 8;
data |= (unsigned int) i2c_read(0x4B);
data >>= 3;

if (data >= 4096)
    data -= 8192;

return ( (double) data) * 0.0625;

常数8192是2 ^ 13。在使用的12 / 13bit表示中, -1等于8191等。

请参阅http://www.kerrywong.com/2014/01/19/lm92-library-for-arduino/以获取参考 实施