本帖最后由 Ding3417 于 2020-10-18 10:47 编辑
现象描述:
在制作无线电压表的时候,需要将设备的数据发送给手机app
手机app添加了numer控件,发现默认收到的数据为:{"num-volt":{"val":"4.1723"},"num-curt":{"val":"72.136"}}
其实是设备端输出的数据就是字符串数据了;
然后导致手机app控件无法解析字符串中的小数,而默认取整数,导致功能不完整;
更改方法:
1、BlinkerApi.c中的【blinker_number_print 】发现value函数默认上传的数据就带了引号, 变成了字符串,需要更改一下语句实现默认上传 【数据】 -------------------------------------------------------------------------------------------------------- //cJSON *value = cJSON_CreateNumber(config->value); //cJSON_AddItemToObject(pValue, BLINKER_CMD_VALUE, value); if (config->value) cJSON_AddStringToObject(pValue, BLINKER_CMD_VALUE, config->value); -------------------------------------------------------------------------------------- 更改为: -------------------------------------------------------------------------------------------------------- cJSON *value = cJSON_CreateNumber(config->value); cJSON_AddItemToObject(pValue, BLINKER_CMD_VALUE, value); //if (config-value) cJSON_AddStringToObject(pValue, BLINKER_CMD_VALUE, config->value); ------------------------------------------------------------------------------------------------------------
另外对应的BlinkerApi.h 文件中【blinker_number_config_t 】定义中需要更改 ------------------------------------------------------------------------------------------------------ typedef struct { const char *icon; const char *color; const char *unit; const char *text; const char *value; } blinker_number_config_t; -------------------------------------------------------------------------------------- 更改为: -------------------------------------------------------------------------------------------------------- typedef struct { const char *icon; const char *color; const char *unit; const char *text; //const char *value; //2020-10-18 shiled double value; //2020-10-18 add } blinker_number_config_t; -----------------------------------------------------------------------------------
同时传给value 的数据类型也要更改为 double类型;
更改之后的手机app收到的数据类型为:{"val":4.1723},"num-curt":{"val":72.136}};;另外发现仪表盘控件暂时不支持小数,暂时只能用方块型数字控件;
分析:
BlinkerApi.c中的【blinker_number_print 】中使用了cjson接口格式化数据
cJSON_AddStringToObject(pValue, BLINKER_CMD_VALUE, config->value); //
这个cJSON_AddStringToObject 是将数据以字符串的形式格式化,将BLINKER_CMD_VALUE 作为标题,config->value作为数据,放进pValue中;
然后加上之前定义的结构体里面默认定义了const char* 类型;
----------------然后就出现了之前的现象!
然后启用下面这两个函数,
cJSON *value = cJSON_CreateNumber(config->value);
cJSON_AddItemToObject(pValue, BLINKER_CMD_VALUE, value);
屏蔽cJSON_AddStringToObject(pValue, BLINKER_CMD_VALUE, config->value); 同时更改结构体里面的value类型为double PS:cJSON_CreateNumber 的数据类型为double 同时传给value 的数据也更改为double类型之后,一系列的数据后,pvalue里的数据就变成了:{"val":4.1723},"num-curt":{"val":72.136}}
|