写在前面:
将JSON应用在STM32上面已经很普遍了,但还是有很多问题在网上找不到答案,毕竟自己造轮子和找轮子造车还是有点差别。
今天就总结一下最近在STM32上使用cJSON所遇到的一些问题。
-------------------------------------------正文开始线-----------------------------------------------
-
什么是cJSON:
JSON的C语言版,一种常用的轻量级数据交换格式,详情见 JSON介绍。
-
cJSON在STM32中的使用:
-
创建一个JSON对象,并加入数据。
-
JSON对象转换为字符串。
-
将字符串解析为JSON对象,并从中取数据。
-
实例
创建JSON对象,并向其中加入数据。
-
//创建json对象
-
cJSON *info;
-
info=
cJSON_CreateObject();
-
-
//添加数据
-
cJSON_AddStringToObject(info,
"sex",
"male");
-
cJSON_AddNumberToObject(info,
"age",
20);
-
cJSON_AddStringToObject(info,
"name",
"weijun");
将JSON对象转换成字符串
-
//字符指针
-
char *jsonStr;
-
//转换函数
-
jsonStr=
cJSON_Print(info);
将字符串转换成JSON并取数据
-
//创建JSON对象
-
cJSON *root;
-
cJSON *name;
-
char *exeStr;
-
-
//解析字符串
-
root =
cJSON_Parse(data);
-
if (!root) {
-
printf(
"get root faild !\n");
-
printf(
"Error before: [%s]\n",
cJSON_GetErrorPtr());
-
}
-
-
//获取数据
-
name =
cJSON_GetObjectItem(root,
"name");
-
if (!name) {
-
printf(
"get name faild !\n");
-
printf(
"Error before: [%s]\n",
cJSON_GetErrorPtr());
-
}
-
-
//转移数据到指针
-
exeStr = (
char*)
malloc(
strlen(name->valuestring));
-
sprintf(exeStr,
"%s", name->valuestring);
-
-
//内存回收
-
cJSON_Delete(root);
-
填坑
对于绝大多数的STM32开发板,创建JSON对象、添加数据、将JSON转换为字符串是不会有问题的。
但是,使用cJSON_Parse()函数时会出错,什么数据都读不出来,究其原因,还是开发板内存不够,经不起JSON的折腾。
但是呢,解决办法也很简单,如下图。
修改启动文件中的Stack_Size和Heap_Size 。下图并不严谨,只是想说把堆栈的内存调大一些,再去编译基本就通过了。
-
Stack_
Size EQU
0x
00002000
-
-
AREA STACK, NOINIT, READWRITE, ALIGN
=
3
-
Stack_Mem
SPACE Stack_
Size
-
__
initial_sp
-
-
;
<h
> Heap
Configuration
-
;
<o
> Heap
Size (
in Bytes)
<
0x
0-
0xFFFFFFFF:
8
>
-
;
<
/h
>
-
-
Heap_
Size EQU
0x
00004000