文章目录
- 问题
- 解决办法
- 方法一
- 方法二
问题
单片机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
然后就正常了