解决方法:STM32使用cJSON解析数据失败
2025-01-08 来源:jianshu
一、问题
在 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: %sn', 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 会申请不到内存。
三、解决方法
增大空间后,问题解决

- 意法半导体中国本地造STM32微控制器启动规模量产
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 基于机智云与STM32的智能拐杖安全监测系统在养老物联网中的应用
- 内置全栈安全,一站式满足CRA法案与IEC 62443标准——米尔STM32MP257核心板
- 如何用 STM32 FLASH 实现等效 100 万次擦写的 EEPROM 功能?
- 实战解析:通过一个小项目掌握STM32所有外设
- STM32学了两年半,却还是不会做项目
- 意法半导体推出最新STM32MP21微处理器,兼具高性价比、低功耗、高灵活性
- 基于STM32的矿井作业环境监测系统设计与实现
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 蓝牙信道探测技术原理与开发套件实践
- Microchip 推出生产就绪型全栈边缘 AI 解决方案,赋能MCU和MPU实现 智能实时决策
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析




