论坛中遇到很多人提到rt_kprintf 了打印数字的问题,LOG_I 打印不出数字,例如:
float value = 1.02f;
rt_kprintf("rt_kprintf_value: %fn", value);
打印出来的结果为:
rt_kprintf_value: %f
自己理想的结果。
我们来查看一下rt_kprintf 结果:
/**
* 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 直接使用打印数字:
float value = 1.02f;
LOG_I("LOG_I_value: %fn", value);
结果也和rt_kprintf 一样:
LOG_I_value: %f
因为 LOG_I 定义的也是 rt_kprintf,我们打开 LOG_I 定义的位置:
if (DBG_LEVEL >= DBG_INFO)
#define LOG_I(fmt, ...) dbg_log_line("I", 32, fmt, ##__VA_ARGS__)
else
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插件,添加插件
目录下多个项目一个 rt_vsnprintf_full-latest包
打开rt_vsnprintf.c,里面也实现了rt_vsnprintf
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,浮点数打印正常
原作者:埃里克陈
|