前言
由于工作需要,需要在STM32上使用Json,所以把一个JSON库移植到了STM32(keil MDK),实际上keil已经有了JSON扩展包(Jansson),只需要从keil官网上下载JSON Pack再导入就行,有兴趣的可以看这篇文章。
这篇文章主要讲解如何把cJSON移植到keil环境下,用于STM32。
测试平台
keil版本:uVision 5.2.1a
芯片型号:STM32F051
下载并移植cJSON库
首先去github下载cJSON库,链接:https://github.com/DaveGamble/cJSON
cJSON有三个源文件及其对应的头文件:cJSON.c/cJSON.h,cJSON_Utils.c/cJSON_Utils.h,test.c/test.h。我们主要使用cJSON和test,把这些文件拷贝到keil工程目录下,并添加入keil工程目录。
由于test.c文件里面有main主函数,可以把这个主函数改一下,然后在自己工程的main主函数调用该测试函数即可。
保存,编译,烧写代码。
注意事项
由于cJSON使用printf打印数据,要先重定向printf输出到串口, 之后用串口调试工具查看cJSON调试信息,具体做法可以点击这里或者参考其他资料;
正常运行cJSON的测试例程需要3KB的heap, 如果芯片内存足够,可以在启动文件(startup_XXX.s)里修改。
注意: 我这次项目使用的芯片是STM32F051,默认大小是512B,不修改这里的话解析test文件的json是会出错的,最多只能解析三层键值项。
cJSON的文档查看github即可。
void test_cjson(void)
{
double grade[4]={66.51,118.52,61.53,128.54};
int time[4]={123,456,789,150};
cJSON *measurements = cJSON_CreateObject(); //创建一个对象
cJSON_AddStringToObject(measurements,"AAA","26.55666"); //添加字符串
cJSON_AddNumberToObject(measurements,"BBB",13); //添加整型数字
cJSON_AddNumberToObject(measurements,"CCC",13.55666); //添加浮点型数字
cJSON_AddFalseToObject(measurements,"gender"); //添加逻辑值false
cJSON_AddStringToObject(measurements,"status","0x8000"); //添加字符串
cJSON *item1 = cJSON_CreateObject(); //创建一个对象
cJSON_AddStringToObject(item1,"item1_string","China"); //添加字符串
cJSON_AddNumberToObject(item1,"item1_num",2021); //添加整型数字
cJSON_AddItemToObject(measurements,"item1",item1);
objJson = cJSON_GetObjectItem(measurements, "AAA");
f1 = strtod(objJson->valuestring, NULL);
char *json_data = cJSON_PrintUnformatted(measurements); //JSON数据结构转换为JSON字符串
printf("%s\n",json_data);//输出字符串
free(json_data);
cJSON_Delete(measurements);//清除结构体
}
原文链接:
https://blog.csdn.net/yannanxiu/article/details/52712078