美文网首页STM32
解决方法:STM32使用cJSON解析数据失败

解决方法:STM32使用cJSON解析数据失败

作者: Leung_ManWah | 来源:发表于2022-06-30 11:03 被阅读0次

    一、问题

    在 STM32 移植 cJSON 库后,使用 cJSON_Parse(),解析失败。

    char cmd[512] = "{\"msg\":\"this is successful start up\",\"result\":1,\"action\":\"req_startUp\",\"responseData\":\"trustedDevice\",\"serial_no\":\"0341\",\"timestamp\":1656489886238}";
    
    cJSON *pRoot = cJSON_Parse(cmd);
    const char *error_ptr = cJSON_GetErrorPtr();
    if (error_ptr != NULL)
    {
        printf("Error before: %s\n", error_ptr);
    }
    

    使用 cJSON_GetErrorPtr() 分析出以下错误:

    Error before: ,"timestamp":1656489886238}
    

    而当去掉 serial_no 字段后,则能够解析成功。

    char cmd[512] = "{\"msg\":\"this is successful start up\",\"result\":1,\"action\":\"req_startUp\",\"responseData\":\"trustedDevice\",\"timestamp\":1656489886238}";
    

    二、原因

    当解析的的数据比较长时,会解析失败,但是短的数据则没有问题,后面排查是因为 cJSON 解析需要用到的内存比较大,溢出导致解析失败。

    查看 STM32 启动文件。如 startup_stm32f407xx.s,发现:

    • 栈区(stack):由编译器自动分配和释放,存放函数的参数值、局部变量的值等,其操作方式类似于数据结构中的栈。
    • 堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。分配方式类似于数据结构中的链表。

    注意:记得要 cJSON_Delete 删除对象,还有 cJSON_Print 会一直不停申请内存,所有调用完之后一定要 free 释放,否则多次调用后一样会内存溢出。导致后面的 cJSON_Print 会申请不到内存。

    三、解决方法

    增大空间后,问题解决



    • 由 Leung 写于 2022 年 6 月 30 日

    • 参考:STM32工程使用cjson库解析数据失败的原因

    相关文章

      网友评论

        本文标题:解决方法:STM32使用cJSON解析数据失败

        本文链接:https://www.haomeiwen.com/subject/qbjfbrtx.html