10 OneNET 浮点数据上传,但小数部分却被截掉

发布于 2021-03-31 13:50:02

使用onenet_mqtt_upload_digit函数上传自定义的rt_uint32_t类型的浮点数,
比如51.11这样的,到云端的数据只有整数部分小数被截掉了;
而如果是float类型的,则直接报错onenet publish failed

请问这是怎么回事啊,该如何解决

查看更多

关注者
0
被浏览
196
4 个回答
mii
mii 2021-03-31

因为onenet平台协议使用了JSON进行通信,而单片使用的是CJSON,
你可以查看onenet_mqtt.conenet_mqtt_get_digit_data函数的实现方式,
里面有JSON的封装输出字符串
msg_str = cJSON_PrintUnformatted(root);
进入调试模式后查看msg_str是否输出正常?

flashman2002
flashman2002 2021-03-31

你是说上传自定义的rt_uint32_t类型的浮点数吗?那自然是只保留整数部分了。

JacobFang
JacobFang 2021-04-01

参考以下代码,我已验证
static void onenet_upload_data_entry(void *parameter)
{

struct recvdata *buf_mp;

/* 永久等待方式接收信号量,若收不到,该线程会一直挂起 */
rt_sem_take(mqttinit_sem, RT_WAITING_FOREVER);
/* 后面用不到这个信号量了,把它删除了,回收资源 */
rt_sem_delete(mqttinit_sem);

while (1)
{
    if (rt_mb_recv(tmp_msg_mb, (rt_ubase_t*)&buf_mp, RT_WAITING_FOREVER) == RT_EOK)
    {
        /* 500ms上传一次数据 */
        rt_thread_delay(rt_tick_from_millisecond(500));
        /* 上传发送节点1的数据到OneNet服务器,数据流名字是temperature_p0 */
        if (onenet_mqtt_upload_digit("temperature_p0", buf_mp->temperature_p0) != RT_EOK)
            rt_kprintf("upload temperature_p0 has an error, try again\n");
        else
            printf("onenet upload OK >>> temp_p0:%f\n", buf_mp->temperature_p0);

        rt_mp_free(buf_mp); /* 释放内存块 */
        buf_mp = RT_NULL;   /* 请务必要做 */
    }
}

}

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览