sprintf 的 %f 浮点数格式无法正常工作
代码中 sprintf 的 %f 浮点数格式无法正常工作,输出了一些垃圾值。%u 和 %d 在 sprintf 中工作正常,但 %f 在我的代码中输出了垃圾值。代码如下。
float Channel_5_Volt;
Channel_5_Volt = ((float)Adc_5_Data/4095)*3.3;
sprintf(Buf,"adc0 %f \r\n", Channel_5_Volt);
HAL_UART_Transmit(&huart1,Buf, sizeof(Buf), 100);
默认情况下,嵌入式 C 库可能未启用浮点数支持。 可能是链接器未链接浮点库。 如果 MCU 支持硬件浮点,但未在编译选项中启用,可能导致浮点运算异常。 启用 newlib-nano 的浮点格式化支持。 检查链接器配置,确保链接器未排除浮点库。 替换为 snprintf 或 vsnprintf。 newlib-nano 默认未启用 %f 支持,或链接器未链接浮点库。 添加 -u _printf_float 和 -lm 编译选项,启用硬件 FPU如适用。 精简版的 C 库默认不包含对浮点数格式化 支持浮点数的 stdio 库。 标准 C 库 使用 snprintf 或 vsnprintf 用整数运算替代浮点数输出 缺少浮点数支持库 char Buf;// 确保缓冲区足够大 手动启用浮点数支持。 void float_to_string(char *str, float f, int precision) {
long p[] = {0,10,100,1000,10000,100000,1000000,10000000,100000000};
char *ptr = str;
char *p1;
char *p2;
unsigned long tmp;
// 处理负数
if (f < 0) {
*ptr++ = '-';
f = -f;
}
// 1. 处理整数部分
tmp = (unsigned long)f;
// 将整数部分转换为字符串并放入缓冲区
// 这里用一个简单的递归或循环来实现,为了简化,我们假设有一个整数转字符串的函数
// 或者直接用 sprintf 处理整数部分 (MicroLIB支持 %d)
ptr += sprintf(ptr, "%lu", tmp);
// 2. 处理小数部分
if (precision > 0) {
*ptr++ = '.'; // 添加小数点
// 计算小数部分
f -= (float)tmp;
tmp = roundf(f * p); // 四舍五入到指定精度
// 处理小数部分前导0的情况 (例如 0.05)
if (tmp < p) {
// 计算需要补多少个0
int leading_zeros = precision - 1;
unsigned long temp = tmp;
while (temp >= 10) {
temp /= 10;
leading_zeros--;
}
for(int i = 0; i < leading_zeros; i++) {
*ptr++ = '0';
}
}
// 将小数部分转换为字符串
ptr += sprintf(ptr, "%lu", tmp);
}
*ptr = '\0'; // 字符串结束符
} 增加缓冲区大小 可尝试使用printf重定向到UART并验证硬件连接。
页:
[1]
2