解决方法:STM32使用cJSON解析数据失败
Posted Leung_ManWah
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决方法:STM32使用cJSON解析数据失败相关的知识,希望对你有一定的参考价值。
一、问题
在 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解析数据失败的主要内容,如果未能解决你的问题,请参考以下文章
JSON数据格式C语言解析库(cJSON)的使用&在STM32上移植和使用
基于STM32的ESP8266天气时钟--------MCU数据处理及显示
基于STM32的ESP8266天气时钟--------MCU数据处理及显示