cJSON移植到STM32F系列单片机

2023-12-03 10:20

本文主要是介绍cJSON移植到STM32F系列单片机,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

项目中用到JSON接收网络数据,具体是STM32串口接收JSON数据,提取需要的内容。本来KEIL MDK是自带JSON的,但是我不习惯使用KEIL自带的那些第三方的东西,很杂乱的感觉。cJSON的移植比较简单,一下子就可以搞定。

1、下载源文件。

http://sourceforge.net/projects/cjson/

只需要两个文件cJSON.c,cJSON.h;下载的包里面还有一个test.c,里面是测试的例子。

http://www.json.org/json-zh.html

这个是JSON的中文说明,明了清晰。

2、实现内存管理接口。

这个可以直接使用原子的Malloc.c,Malloc.h,并修改合适的管理内存大小MEM_MAX_SIZE。

3、修改源代码

将cJSON.c里面所有的malloc何free为自定义内存管理函数。注意是所有。

4、测试。

下载的包里面test.c里面有很多例子,可以拿来测试。

4.1

这个是解析JSON字符串的:

/* Parse text to JSON, then render back to text, and print! */
void doit(char *text)
{char *out;cJSON *json;json=cJSON_Parse(text);if (!json) {printf("Error before: [%s]\n",cJSON_GetErrorPtr());}else{out=cJSON_Print(json);cJSON_Delete(json);printf("%s\n",out);myfree(out);}
}

使用PC串口根据和STM32的串口测试一段字符串:

接收的文本为

{"a":	"1","b":	{"a1":	1.100000}
}

故意发送弄个不合规范的试试:

4.2

还有生成JSON的代码:

/* Used by some code below as an example datatype. */
struct record {const char *precision;double lat,lon;const char *address,*city,*state,*zip,*country; };/* Create a bunch of objects as demonstration. */
void create_objects()
{cJSON *root,*fmt,*img,*thm,*fld;char *out;int i;    /* declare a few. *//* Our "days of the week" array: */const char *strings[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};/* Our matrix: */int numbers[3][3]={{0,-1,0},{1,0,0},{0,0,1}};/* Our "gallery" item: */int ids[4]={116,943,234,38793};/* Our array of "records": */struct record fields[2]={{"zip",37.7668,-1.223959e+2,"","SAN FRANCISCO","CA","94107","US"},{"zip",37.371991,-1.22026e+2,"","SUNNYVALE","CA","94085","US"}};/* Here we construct some JSON standards, from the JSON site. */printf("\r\n ***start***%d%% \r\n",mem_perused());/* Our "Video" datatype: */root=cJSON_CreateObject();    cJSON_AddItemToObject(root, "name", cJSON_CreateString("Jack (\"Bee\") Nimble"));cJSON_AddItemToObject(root, "format", fmt=cJSON_CreateObject());cJSON_AddStringToObject(fmt,"type",        "rect");cJSON_AddNumberToObject(fmt,"width",        1920);cJSON_AddNumberToObject(fmt,"height",        1080);cJSON_AddFalseToObject (fmt,"interlace");cJSON_AddNumberToObject(fmt,"frame rate",    24);out=cJSON_Print(root);    cJSON_Delete(root);    printf("%s\n",out);    myfree(out);    /* Print to text, Delete the cJSON, print it, release the string. *//* Our "days of the week" array: */root=cJSON_CreateStringArray(strings,7);out=cJSON_Print(root);    cJSON_Delete(root);    printf("%s\n",out);    myfree(out);/* Our matrix: */root=cJSON_CreateArray();for (i=0;i<3;i++) cJSON_AddItemToArray(root,cJSON_CreateIntArray(numbers[i],3));/*    cJSON_ReplaceItemInArray(root,1,cJSON_CreateString("Replacement")); */out=cJSON_Print(root);    cJSON_Delete(root);    printf("%s\n",out);    myfree(out);/* Our "gallery" item: */root=cJSON_CreateObject();cJSON_AddItemToObject(root, "Image", img=cJSON_CreateObject());cJSON_AddNumberToObject(img,"Width",800);cJSON_AddNumberToObject(img,"Height",600);cJSON_AddStringToObject(img,"Title","View from 15th Floor");cJSON_AddItemToObject(img, "Thumbnail", thm=cJSON_CreateObject());cJSON_AddStringToObject(thm, "Url", "http:/*www.example.com/image/481989943");cJSON_AddNumberToObject(thm,"Height",125);cJSON_AddStringToObject(thm,"Width","100");cJSON_AddItemToObject(img,"IDs", cJSON_CreateIntArray(ids,4));out=cJSON_Print(root);    cJSON_Delete(root);    printf("%s\n",out);    myfree(out);/* Our array of "records": */root=cJSON_CreateArray();for (i=0;i<2;i++){cJSON_AddItemToArray(root,fld=cJSON_CreateObject());cJSON_AddStringToObject(fld, "precision", fields[i].precision);cJSON_AddNumberToObject(fld, "Latitude", fields[i].lat);cJSON_AddNumberToObject(fld, "Longitude", fields[i].lon);cJSON_AddStringToObject(fld, "Address", fields[i].address);cJSON_AddStringToObject(fld, "City", fields[i].city);cJSON_AddStringToObject(fld, "State", fields[i].state);cJSON_AddStringToObject(fld, "Zip", fields[i].zip);cJSON_AddStringToObject(fld, "Country", fields[i].country);}/*    cJSON_ReplaceItemInObject(cJSON_GetArrayItem(root,1),"City",cJSON_CreateIntArray(ids,4)); */printf("\r\n ***mem***%d%% \r\n",mem_perused());out=cJSON_Print(root);    cJSON_Delete(root);    printf("%s\n",out);    myfree(out);printf("\r\n ***end***%d%% \r\n",mem_perused());
}

其中函数mem_perused()为获取管理内存的使用率函数。

因为之前看网上有人移植后内存出现问题,估计是没有使用正确的内存释放函数。而这里,经过上百次连续使用,内存使用没有问题。如下:

	 ***start***0% 
{"name":	"Jack (\"Bee\") Nimble","format":	{"type":	"rect","width":	1920,"height":	1080,"interlace":	false,"frame rate":	24}
}
["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
[[0, -1, 0], [1, 0, 0], [0, 0, 1]]
{"Image":	{"Width":	800,"Height":	600,"Title":	"View from 15th Floor","Thumbnail":	{"Url":	"http:/*www.example.com/image/481989943","Height":	125,"Width":	"100"},"IDs":	[116, 943, 234, 38793]}
}***mem***12% 
[{"precision":	"zip","Latitude":	37.766800,"Longitude":	-122.395900,"Address":	"","City":	"SAN FRANCISCO","State":	"CA","Zip":	"94107","Country":	"US"}, {"precision":	"zip","Latitude":	37.371991,"Longitude":	-122.026000,"Address":	"","City":	"SUNNYVALE","State":	"CA","Zip":	"94085","Country":	"US"}]***end***0% 

我的管理内存总共为16K,一开始使用率为0%,中间出现过使用率为12%,最后完全释放,又恢复0%。循环测试几百遍都OK。

https://blog.csdn.net/wangzibigan/article/details/85114223

这篇关于cJSON移植到STM32F系列单片机的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/449082

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

GPT系列之:GPT-1,GPT-2,GPT-3详细解读

一、GPT1 论文:Improving Language Understanding by Generative Pre-Training 链接:https://cdn.openai.com/research-covers/languageunsupervised/language_understanding_paper.pdf 启发点:生成loss和微调loss同时作用,让下游任务来适应预训

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订

Java基础回顾系列-第七天-高级编程之IO

Java基础回顾系列-第七天-高级编程之IO 文件操作字节流与字符流OutputStream字节输出流FileOutputStream InputStream字节输入流FileInputStream Writer字符输出流FileWriter Reader字符输入流字节流与字符流的区别转换流InputStreamReaderOutputStreamWriter 文件复制 字符编码内存操作流(

Java基础回顾系列-第五天-高级编程之API类库

Java基础回顾系列-第五天-高级编程之API类库 Java基础类库StringBufferStringBuilderStringCharSequence接口AutoCloseable接口RuntimeSystemCleaner对象克隆 数字操作类Math数学计算类Random随机数生成类BigInteger/BigDecimal大数字操作类 日期操作类DateSimpleDateForma