如何将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
相关产品推荐
相关产品推荐

