请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103 cJson 嵌套解析,求指导

[复制链接]
wdshuang09 提问时间:2019-3-21 22:06 /
上位机发送json,{"cmd" : "device_hard","desc" : "dyaw","out":{"desc1":"V1.00","type":"string"}}STM32f1串口接收到数组里,"out":{"desc":"V1.00","type":"string"}不知道怎么解析出来,求指导。
        cJSON *root;
        cJSON *cmd;
        cJSON *desc;
        cJSON *output;
        cJSON *hard;
        cJSON *taskArry;
        cJSON *desc1;
        cJSON *type;
        cJSON * temp;
        int i ,icount;

        root = mymalloc(SRAMIN,sizeof(cJSON));
        root = cJSON_Parse((const char*)uart1Buf.Rx_Buffer);

       cmd= cJSON_GetObjectItem(root,"cmd");
       if(desc != NULL)
        {

         printf("cmd= %s\r\n",(cmd->valuestring));
       }
        desc= cJSON_GetObjectItem(root,"desc");
        if(desc != NULL)
        {
                printf("desc= %s\r\n",(desc->valuestring));
        }
        //以下这段解析不对,不知道怎么修改了
        temp=cJSON_GetObjectItem(root,"output");
        if(temp != NULL)
        {
                icount = cJSON_GetArraySize(output);
                printf( "icount=%d : \n",icount);
                for(i=0; i < icount; i++)
                {
                         output=cJSON_GetArrayItem(output, i);
                        if(output != NULL)
                        {
                                desc1 = cJSON_GetObjectItem(output, "desc1");
                                printf("desc1= %s\r\n",(desc1->valuestring));
                                type= cJSON_GetObjectItem(output, "type");
                                printf("type= %s\r\n",(type->valuestring));
                        }
                       
                }

   }
cJSON_Delete(root);       
my_free(root);
my_free(cmd);

收藏 评论18 发布时间:2019-3-21 22:06

举报

18个回答
yklstudent 回答时间:2019-3-22 21:38:38
wdshuang09 发表于 2019-3-22 20:53
"out":[{"desc":"V1.00","type":"string"}]如果是这样,应该怎么解析?

const char * m_json_context =
{
        "{\"cmd\" : \"device_hard\",\"desc\" : \"dyaw\",\"out\":[{\"desc1\":\"V1.00\",\"type\":\"string\"}]}"
};

const cJSON *json_body = NULL;
const cJSON *json_list = NULL;
const cJSON *m_id_str = NULL;
const cJSON *m_price_str = NULL;

bool json_parse_info(const char * const context)
{
        bool status = false;
       
        cJSON *json_context = cJSON_Parse(context);
       
        if(json_context == NULL)
        {
                const char *err_ptr = cJSON_GetErrorPtr();
                if(err_ptr != NULL)
                {
                        usart_send_data_packet(&usart_drivers[eUSART1], (uint8_t*)err_ptr, strlen(err_ptr));
                }
                cJSON_Delete(json_context);
                return status;
        }
        // 项目01
        json_body = cJSON_GetObjectItemCaseSensitive(json_context, "cmd");
        if( !cJSON_IsString(json_body) )
        {
                cJSON_Delete(json_context);
                return status;
        }
        // 项目02
        json_body = cJSON_GetObjectItemCaseSensitive(json_context, "desc");
        if( !cJSON_IsString(json_body) )
        {
                cJSON_Delete(json_context);
                return status;
        }
        // 项目03
        json_body = cJSON_GetObjectItemCaseSensitive(json_context, "out");
        cJSON_ArrayForEach(json_list, json_body)
        {
                // xx1
                m_id_str = cJSON_GetObjectItemCaseSensitive(json_list, "desc1");
                // xx2
                m_price_str = cJSON_GetObjectItemCaseSensitive(json_list, "type");
                // 判断处理
                if( !cJSON_IsString(m_id_str) || !cJSON_IsString(m_price_str) )
                {
                        cJSON_Delete(json_context);
                        return status;
                }
        }
        cJSON_Delete(json_context);
        return status;
}
wdshuang09 回答时间:2019-3-25 11:58:45
yklstudent-1794 发表于 2019-3-24 22:24
感觉可能还是你的my_malloc和my_free部分有问题,替换回原来的malloc和free后就没有问题,你在线调试找找 ...

函数已换成malloc和free的,发送都正常,解析第一次串口收到的数据正常,当串口再接收到一个数据,进行解析就死机了。
进入
void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}
解析函数
void ProtocolGetOnePacket(void)
{
        cJSON * root = NULL;
        cJSON *cmd= NULL;
        char *string = NULL;
       
        root = malloc(sizeof(cJSON));
        cmd = malloc(sizeof(cJSON));
       
        root = cJSON_Parse((const char*)uart1Buf.Tx_Buffer);
        __nop();
        if(root != NULL)
        {
                string=cJSON_PrintUnformatted(root);
                printf("%s\n\n", string);
                cmd= cJSON_GetObjectItem(root,"cmd");
                if(cmd != NULL)
                {
                        if (!strncmp(cmd->valuestring, "get_device_hard", strlen("get_device_hard")))
                        {
                                printf("cmd= %s\r\n",(cmd->valuestring));
                                //Parse_Get_Device_Hard();
                        }
                }       
        }
       
        cJSON_Delete(root);       
        free(cmd);
        free(string);
        free(root);
        __nop();
        //
       
}

是不是内存溢出了,但是
我的Heap_Size 只能分配到1K,型号STM32F103C8
如果改成如下就编译通不过
Heap_Size       EQU     0x00004000  ;
1.jpg
2.jpg
yklstudent 回答时间:2019-3-25 13:13:12
wdshuang09 发表于 2019-3-25 11:58
函数已换成malloc和free的,发送都正常,解析第一次串口收到的数据正常,当串口再接收到一个数据,进行解 ...

给你一个我写的demo:
// 解析JSON升级版本与url地址
static bool json_parser_object_update(char *str, int len, mico_content_t * const inContext)
{
    const cJSON *json_body = NULL;

    cJSON *json_context = cJSON_Parse(str);
    if(json_context == NULL)
    {
        const char *err_ptr = cJSON_GetErrorPtr();
        if(err_ptr != NULL)
        {
            Ql_Debug_Trace("%s", err_ptr);
        }
        cJSON_Delete(json_context);
        return FALSE;
    }

    json_body = cJSON_GetObjectItem(json_context, "firm_ver");
    if( !cJSON_IsString(json_body) )
    {
        cJSON_Delete(json_context);
        return FALSE;
    }
    Ql_sprintf(inContext->update_ver, json_body->valuestring);
    Ql_Debug_Trace("firm_ver=%s", inContext->update_ver);

    json_body = cJSON_GetObjectItem(json_context, "file_url");
    if( !cJSON_IsString(json_body) )
    {
        cJSON_Delete(json_context);
        return FALSE;
    }
    Ql_sprintf(inContext->update_url, json_body->valuestring);
    Ql_Debug_Trace("file_url=%s", inContext->update_url);

    json_body = cJSON_GetObjectItem(json_context, "file_md5");
    if( !cJSON_IsString(json_body) )
    {
        cJSON_Delete(json_context);
        return FALSE;
    }
    Ql_sprintf(inContext->update_md5, json_body->valuestring);
    Ql_Debug_Trace("file_md5=%s", inContext->update_md5);

    cJSON_Delete(json_context);
    return TRUE;
}
你自己参考下
yklstudent 回答时间:2019-3-22 09:05:35
"out":{"desc":"V1.00","type":"string"}
这个数据内容有问题,应该为:"out":[{"desc":"V1.00","type":"string"}]

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

mj1114 回答时间:2019-3-22 14:21:56
where is "output"
wdshuang09 回答时间:2019-3-22 20:53:54
yklstudent-1794 发表于 2019-3-22 09:05
"out":{"desc":"V1.00","type":"string"}
这个数据内容有问题,应该为:"out":[{"desc":"V1.00","type":"st ...

"out":[{"desc":"V1.00","type":"string"}]如果是这样,应该怎么解析?
wdshuang09 回答时间:2019-3-23 13:09:10
yklstudent-1794 发表于 2019-3-22 21:38
const char * m_json_context =
{
        "{\"cmd\" : \"device_hard\",\"desc\" : \"dyaw\",\"out\":[{\"desc ...

cJSON_GetObjectItemCaseSensitive()这个函数在CJson没有找到,后面网上找到了cJSON-master这个里面有这个函数,再弱弱的想请教一下,用cJSON-master的库怎么移植到STM32F103中?我没有移植成功,能否提供一个例子参考一下谢谢!
我的cjson移植是参考http://www.openedv.com/forum.php?mod=viewthread&tid=229818
yklstudent 回答时间:2019-3-23 19:11:16
wdshuang09 发表于 2019-3-23 13:09
cJSON_GetObjectItemCaseSensitive()这个函数在CJson没有找到,后面网上找到了cJSON-master这个里面有 ...

你用的老版本?
那就用cJSON_GetObjectItem函数好了
wdshuang09 回答时间:2019-3-24 17:42:40
本帖最后由 wdshuang09 于 2019-3-24 19:46 编辑
yklstudent-1794 发表于 2019-3-23 19:11
你用的老版本?
那就用cJSON_GetObjectItem函数好了

cJSON-master已成功移植STM32F1,现在已解析数据出来,但是出了一个新的问题;原本创建的JSON数据包在老版本JSON库是可以正常发出去的图1,但改成cJSON-master的文件就发送不出去见图片2,不知道问题出在哪?
发送JSON数据包函数如下:
       cJSON *root = NULL;
        char *string = NULL;
        root= cJSON_CreateObject();
        cJSON_AddItemToObject(root, "cmd", cJSON_CreateString("device_desc"));
        cJSON_AddItemToObject(root, "desc", cJSON_CreateString("dzfz")) ;
        cJSON_AddItemToObject(root, "id", cJSON_CreateString("dzfzno1"));
        cJSON_AddItemToObject(root, "hard", cJSON_CreateString("V1.00"));
        cJSON_AddItemToObject(root, "row", cJSON_CreateString("4"));
        __nop();
        string = cJSON_Print(root);
        __nop();
        printf("%s\n",string);
        if (string == NULL)
        {
                printf("\nFailed to print root.\n");
        }
        my_free(string);
        cJSON_Delete(root);
        my_free(root);

图2

图2

图1

图1
yklstudent 回答时间:2019-3-24 20:03:34
wdshuang09 发表于 2019-3-24 17:42
cJSON-master已成功移植STM32F1,现在已解析数据出来,但是出了一个新的问题;原本创建的JSON数据包在老版 ...

上工程看看
wdshuang09 回答时间:2019-3-24 21:18:20
本帖最后由 wdshuang09 于 2019-4-12 20:38 编辑

工程文件已上传,请帮忙看一下
yklstudent 回答时间:2019-3-24 22:24:12
wdshuang09 发表于 2019-3-24 21:18
工程文件已上传,请帮忙看一下

感觉可能还是你的my_malloc和my_free部分有问题,替换回原来的malloc和free后就没有问题,你在线调试找找啥问题吧,看那步出了问题
wdshuang09 回答时间:2019-3-28 08:54:54
yklstudent-1794 发表于 2019-3-25 13:13
给你一个我写的demo:
// 解析JSON升级版本与url地址
static bool json_parser_object_update(char *str, ...

现在已经调通了,有没有遇到这个问题,100ms连续的发数据就会出错,会出现root==NULL,这个问题是怎么造成的?
1.jpg
yklstudent 回答时间:2019-3-28 09:42:32
wdshuang09 发表于 2019-3-28 08:54
现在已经调通了,有没有遇到这个问题,100ms连续的发数据就会出错,会出现root==NULL,这个问题是怎么造成 ...

const char *err_ptr = cJSON_GetErrorPtr();
看看返回什么错误
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版