RT-Thread中rt_kprintf函数无法输出浮点数和HAL_Snprintf无法格式化%f的问题

一、在调MQTT时,使用HAL_Snprintf格式化字符串,发现%d格式化正常,而%f格式化无效。测试一下rt_kprintf是不是也有这个问题,后面也是出现%f浮点输出异常。

static int example_publish(void *handle)
{
    static char cnt = 0;
    int             res = 0;
    const char     *fmt = "/sys/%s/%s/thing/event/property/post";
/*    /sys/k1gvsKKWBKb/${deviceName}/thing/event/property/post  */
    char           *topic = NULL;
    int             topic_len = 0;
    const  char    *payload = "{\"params\": {\"Weather\": %d, \"temperature\": %.1f, \"describe\": \"rawgan_describe03\"} }";

    char           *para = NULL;
    int             para_len = 0;

    topic_len = strlen(fmt) + strlen(DEMO_PRODUCT_KEY) + strlen(DEMO_DEVICE_NAME) + 1;
    topic = HAL_Malloc(topic_len);
    if (topic == NULL) {
        EXAMPLE_TRACE("memory not enough");
        return -1;
    }
    memset(topic, 0, topic_len);
    HAL_Snprintf(topic, topic_len, fmt, DEMO_PRODUCT_KEY, DEMO_DEVICE_NAME);

    para_len = strlen(payload) + 8;
    para = HAL_Malloc(para_len);
    if (para == NULL) {
        EXAMPLE_TRACE("memory not enough");
        return -1;
    }
    memset(para, 0, para_len);
    HAL_Snprintf(para, para_len, payload, cnt, tem);
    cnt++;
    rt_kprintf("para:%s\n",para);

//    res = IOT_MQTT_Publish_Simple(0, topic, IOTX_MQTT_QOS0, payload, strlen(payload));
    res = IOT_MQTT_Publish_Simple(0, topic, IOTX_MQTT_QOS0, para, para_len);
    if (res < 0) {
        EXAMPLE_TRACE("publish failed, res = %d", res);
        HAL_Free(topic);
        return -1;
    }

    HAL_Free(topic);
    HAL_Free(para);
    return 0;
}

二、经查询资料发现是rt_vsnprintf的原因,直接粗暴把rt_kprintf和HAL_Snprintf函数调用的rt_vsnprintf直接改为vsnprintf,加入头文件#include <stdio.h>。浮点功能恢复正常。

RT_WEAK 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);
    length = 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_device_write(_console_device, 0, rt_log_buf, length);
    }
#else
    rt_hw_console_output(rt_log_buf);
#endif /* RT_USING_DEVICE */
    va_end(args);
}
RTM_EXPORT(rt_kprintf);
int HAL_Snprintf(char *str, const int len, const char *fmt, ...)
{
    va_list args;
    int     rc;

    va_start(args, fmt);
//    rc = rt_vsnprintf(str, len, fmt, args);
    rc = vsnprintf(str, len, fmt, args);
    va_end(args);

    return rc;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值