You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将LM73温度寄存器数据转换为带小数的正负温度并通过UART输出?

LM73带小数正负温度输出实现方案

问题背景

已通过I2C读取LM73的16位温度寄存器数据到uint8_t rx_buf[2],但当前代码仅能输出无符号整数温度,需要实现支持正负、带小数的温度UART输出。

实现思路与代码修改

1. 明确LM73温度数据格式

LM73的16位温度寄存器为有符号补码格式:

  • 最高位(D15)为符号位:0表示正温度,1表示负温度
  • 整个16位数值的每1单位对应1/256℃(约0.0039℃),整数部分占高8位,小数部分占低8位。

2. 原始数据转浮点温度值

将rx_buf的两个字节拼接为16位有符号整数,再除以256.0得到带小数的温度值:

// 拼接高、低字节为16位有符号整数
int16_t raw_temp = (int16_t)(rx_buf[0] << 8 | rx_buf[1]);
// 转换为带小数的浮点温度
float temp = raw_temp / 256.0f;

3. 格式化并输出到UART

用snprintf(比sprintf更安全,避免缓冲区溢出)将浮点温度格式化为字符串,再通过UART发送:

char uart_buffer[20];
// 格式化温度为保留两位小数的字符串,支持正负
snprintf(uart_buffer, sizeof(uart_buffer), "%.2f°C\r\n", temp);

// 发送整个字符串,直到遇到结束符
for (int i = 0; uart_buffer[i] != '\0'; i++) {
    USART_write(uart_buffer[i]);
}

完整修改后的代码

void lm73_read_temp(void)
{
    uint8_t rx_buf[2];
    uint8_t rx_len = 2;

    I2C_MasterReceiveData(&I2C1Handle, rx_buf, rx_len, SLAVE_ADDR);

    // 转换原始数据为带小数的温度值
    int16_t raw_temp = (int16_t)(rx_buf[0] << 8 | rx_buf[1]);
    float temp = raw_temp / 256.0f;

    char uart_buffer[20];
    memset(uart_buffer, 0, sizeof(uart_buffer));
    // 格式化输出,可根据需求调整小数位数(如%.3f保留三位)
    snprintf(uart_buffer, sizeof(uart_buffer), "%.2f°C", temp);

    // 发送温度字符串
    for(int i = 0; uart_buffer[i] != '\0'; i++)
    {
        USART_write(uart_buffer[i]);
    }
    // 发送换行便于查看
    USART_write('\r');
    USART_write('\n');
}

关键注意事项

  • 符号处理:int16_t会自动解析补码的符号位,负数会被正确转换为负浮点值。
  • 精度选择:LM73的分辨率是0.0039℃,保留2~3位小数足以满足大部分场景需求。
  • 缓冲区安全:使用snprintf时必须传入缓冲区大小,防止字符串溢出。

内容的提问来源于stack exchange,提问作者Mini Tamm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 00:13:31