一、在调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;
}