单片机
返回首页

解决方法: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 会申请不到内存。

三、解决方法

增大空间后,问题解决



进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 1瓦线性调频增强器

  • 1瓦四级调频发射机

  • 500W MOS场效应管电源逆变器,12V转110V/220V

  • 红外开关

  • LM317过压保护

  • 0-30V/20A 大功率稳压电源(采用LM338)

    相关电子头条文章