如何将Arduino测量的温度值通过UART发送至串口捕获程序?
解决Arduino UART发送float温度值的问题
看起来你踩了一个很常见的UART发送误区——你的transmit函数只能发送单个字节(int8_t类型),而直接传float变量、粗暴强转成char,或者用itoa(只支持整数)都没法把完整的温度数据正确传到串口。下面是具体的解决方案:
问题根源
你的transmit函数设计是发送单个字节,但float是4字节的浮点型数据,直接传递的话会被截断成int8_t(只保留最低1字节),强转char也只会取温度的整数部分(还可能溢出),这就是Realterm看不到正确输出的原因。
正确实现方式:把float转成字符串再逐个字节发送
我们需要先把浮点型的温度值格式化成人类可读的字符串,然后遍历字符串的每个字符,调用transmit逐个发送。这里有两种可靠的方法:
方法1:使用sprintf格式化字符串
修改你的主循环代码如下:
while(1) { int reading = ADCsingleREAD(0); //读取端口0的传感器数据 float voltage = reading * (5.0f / 1024.0f); float temperature = (voltage - 0.5f) * 100; // 定义足够大的缓冲区存储温度字符串(比如16字节足够) char temp_str[16]; // 格式化温度为带1位小数的字符串,可按需调整小数位数(比如%.2f保留两位) sprintf(temp_str, "Temperature: %.1f °C\n", temperature); // 遍历字符串,逐个字符发送 for (int i = 0; temp_str[i] != '\0'; i++) { transmit((int8_t)temp_str[i]); } _delay_ms(100); }
⚠️ 注意:如果你的AVR编译器(比如avr-gcc)默认不支持float的sprintf格式化,需要在编译时添加链接选项:-Wl,-u,vfprintf -lprintf_flt,启用浮点数格式化支持。
方法2:使用AVR专属的dtostrf函数
dtostrf是AVR库专门为浮点数转字符串设计的函数,兼容性更好,不需要额外编译选项:
#include <string.h> // 需要strcat的话要包含这个头文件 while(1) { int reading = ADCsingleREAD(0); float voltage = reading * (5.0f / 1024.0f); float temperature = (voltage - 0.5f) * 100; char temp_str[16]; // dtostrf(浮点数值, 总宽度, 小数位数, 目标缓冲区) // 这里总宽度设为4,小数位数1,会输出类似" 25.5"(前面补空格) dtostrf(temperature, 4, 1, temp_str); // 可以拼接成更友好的格式 strcat(temp_str, " °C\n"); // 逐个发送字符 for (int i = 0; temp_str[i] != '\0'; i++) { transmit((int8_t)temp_str[i]); } _delay_ms(100); }
为什么之前的尝试不行?
transmit(temperature):直接传递float,函数会把它强制转换成int8_t,只发送float的最低1字节,完全丢失了温度的有效信息。char a = temperature;:强转char只会取温度的整数部分,比如25.6会变成25,而且如果温度超过char的范围(-128~127)还会溢出。itoa(temperature, buffer, 10):itoa只支持整数类型,传入float会被截断,同样得不到正确结果。
内容的提问来源于stack exchange,提问作者kasrra
相关产品推荐
相关产品推荐

