单片机使用cJSON常见问题及解决指南

文章目录

  • 问题
  • 解决办法
  • 方法一
  • 方法二
  • 问题

    单片机USAR串口通信我想用json,
    我不想用 分隔符的方式。感觉性能够,还有就是方便理解。

    mcu型号 : AT32F415系列
    雅特力的。
    cJSON库: https://github.com/DaveGamble/cJSON/tree/master
    只要把 cJSON.h 和 cJSON.c文件复制到项目中就能用了。
    但是呢,会遇到问题:

    	char* str4;
    	cjson_test1 = cJSON_CreateObject();
    	cJSON_AddStringToObject(cjson_test1, "jeckxu666", "test_code");
    	cJSON_AddStringToObject(cjson_test1, "time", "2024-8-25");
    	cJSON_AddNumberToObject(cjson_test1, "num", 666);
    	str4 = cJSON_Print(cjson_test1);
    	printf("cJSON_Print: %s \r\n", str4);
    


    结果就是只输出了一个字符。查到的原因据说是内存不足。
    有两个解决办法:

    解决办法

    方法一

    修改 堆栈区,将启动的汇编文件 startup_at32f415.s 里面的堆栈值改大一点。

    数字前面改成1 ,一般就好了
    Stack_Size EQU 0x00001400
    Heap_Size EQU 0x00001200

    我的建议是 不建议这么做,因为修改这个文件,这个文件是官方提供的。别人拿你的文件不太敢用。

    方法二

    换函数

     	const char* strVersion;
        char* str3;
    	char* str4;
        char *str5;
        char outputBuffer[1024];
      
      cjson_test1 = NULL;
      cjson_test2 = NULL;
      cjson_test1 = cJSON_CreateObject();
      cJSON_AddStringToObject(cjson_test1, "jeckxu666", "test_code");
      cJSON_AddStringToObject(cjson_test1, "time", "2022-2-25");
    	cJSON_AddNumberToObject(cjson_test1, "num", 666);
        str4 = cJSON_Print(cjson_test1);
        strVersion = cJSON_Version();
        //printf("cJSON_Print: %s \r\n", str4);
      // if(cJSON_PrintPreallocated(cjson_test1, outputBuffer, 1000, 1))
      //       printf("cJSON_PrintPreallocated(): \n%s\n", outputBuffer);
      str5 = cJSON_PrintBuffered(cjson_test1,(int)sizeof(cjson_test1) + 5,1);
      printf("%s \r\n",str5);
    

    cJSON_PrintPreallocated
    或者
    cJSON_PrintBuffered 
    


    然后就正常了

    作者:蓝黑墨水

    物联沃分享整理
    物联沃-IOTWORD物联网 » 单片机使用cJSON常见问题及解决指南

    发表回复