Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
float_double_fpu浮点运算
rt_kprintf
RT-Thread rt_kprintf 格式化输出浮点数
1.00
发布于 2021-11-29 23:31:51 浏览:5015
订阅该版
[tocm] 在论坛中遇到很多人提到 `rt_kprintf `打印不出浮点数的问题,`LOG_I `打印不出浮点数,例如: ```c float value = 1.02f; rt_kprintf("rt_kprintf_value: %f\n", value); ``` 打印出来的结果为: ```c rt_kprintf_value: %f ``` 并不是理想的结果。 那么我们来查看一下 `rt_kprintf `源码: ```c /** * This function will print a formatted string on system console * * @param fmt the format */ void rt_kprintf(const char *fmt, ...) { va_list args; rt_size_t length; static char rt_log_buf[RT_CONSOLEBUF_SIZE]; va_start(args, fmt); /* the return value of vsnprintf is the number of bytes that would be * written to buffer had if the size of the buffer been sufficiently * large excluding the terminating null byte. If the output string * would be larger than the rt_log_buf, we have to adjust the output * length. */ length = rt_vsnprintf(rt_log_buf, sizeof(rt_log_buf) - 1, fmt, args); if (length > RT_CONSOLEBUF_SIZE - 1) length = RT_CONSOLEBUF_SIZE - 1; #ifdef RT_USING_DEVICE if (_console_device == RT_NULL) { rt_hw_console_output(rt_log_buf); } else { rt_uint16_t old_flag = _console_device->open_flag; _console_device->open_flag |= RT_DEVICE_FLAG_STREAM; rt_device_write(_console_device, 0, rt_log_buf, length); _console_device->open_flag = old_flag; } #else rt_hw_console_output(rt_log_buf); #endif va_end(args); } ``` 其中最重要的 `rt_vsnprintf`,这个函数将可变参数格式化输出到一个字符数组,并返回字符数组的长度。目前内核的 `rt_vsnprintf `并未支持浮点数的打印,因为基于体积考虑,所以并未添加这么复杂的功能。 #### LOG_I 为什么不能输出浮点数 如果直接用 `LOG_I `打印浮点数: ```C float value = 1.02f; LOG_I("LOG_I_value: %f\n", value); ``` 结果也和 `rt_kprintf `一样: ``` LOG_I_value: %f ``` 因为 LOG_I 调的也是 rt_kprintf,我们打开 LOG_I 定义的位置: ```c if (DBG_LEVEL >= DBG_INFO) #define LOG_I(fmt, ...) dbg_log_line("I", 32, fmt, ##__VA_ARGS__) else ``` ```c define dbg_log_line(lvl, color_n, fmt, ...) \ do \ { \ _DBG_LOG_HDR(lvl, color_n); \ rt_kprintf(fmt, ##__VA_ARGS__); \ _DBG_LOG_X_END; \ } \ while (0) ``` `LOG_I `通过宏定义 `dbg_log_line`,调用 `rt_kprintf `打印数据 #### 如何使用 rt_kprintf 打印浮点数 - 使用 `RT-Thread Studio` 打开 `RT-Thread Settings`, 点击添加软件包,输入关键字 `printf`, 添加 `rt_vsnprintf_full` 软件包,保存 ![image-20211129231948911.png](https://oss-club.rt-thread.org/uploads/20211129/6888bb835c8cb8c518a9b32549c55d8d.png.webp) - 软件包目录下多出了一个 `rt_vsnprintf_full-latest` 包 ![image-20211129232321829.png](https://oss-club.rt-thread.org/uploads/20211129/8f9840669e643956b8ade4f8e8304c97.png) - 打开 rt_vsnprintf.c,发现其中也实现了 rt_vsnprintf ```c rt_int32_t rt_vsnprintf(char *buf, rt_size_t size, const char *fmt, va_list args) { return __vsnprintf(out_buffer, buf, size, fmt, args); } ``` - 注释 kservice.c 中的 rt_vsnprintf - 重新编译并运行 `rt_kprintf ` 和 `LOG_I`, 浮点数打印正常 ![image.png](https://oss-club.rt-thread.org/uploads/20211130/08dc5bbbde0a900c1dcc0118da827197.png)
15
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
ErikChan
这家伙很懒,什么也没写!
文章
6
回答
134
被采纳
32
关注TA
发私信
相关文章
1
rt_kprintf问题,拔掉串口系统就不运行了么?
2
rt_kprintf打印异常
3
开启C++功能后,rt_kprintf和单步调试功能无法使用
4
大家有什么好用的方法开关串口打印吗
5
rt_kprintf 格式描述符
6
怎么实现printf函数打印浮点数?
7
rt_kprintf串口打印信息有时出现乱码,有时候又是正常的
8
GD32E230k开发板,打开终端窗口中最后一行是这样的,是什么问题,怎么解决?
9
rt_thread studio rt_kprintf输出中文乱码?
10
关于rt_kprintf无法显示浮点数
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
keil_MDK
msh
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
812
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
2
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部