【嵌入式项目应用】__cJSON在单片机的使用

这篇具有很好参考价值的文章主要介绍了【嵌入式项目应用】__cJSON在单片机的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言

一、JSON和cJson

二、cJSON是如何表示JSON数据的

三、如何封装完整的JSON数据

1. 先将串口打通,方便电脑查看log日志。

2. 增加cjson.c文件,已经在main.c中

3. 准备打包如下的JSON包

4. 代码部分,先将几个部分初始化指针

5. 创建链表

6. 我们查看添加的是否正确,可以将链表通过串口打印出来。

 7. 效果如下:

四、解包

五、总结

(* ̄︶ ̄)创作不易!期待你们的 点赞、收藏和评论喔。 


前言

在使用MQTT传输数据的时候,经常使用到JSON包,来进行数据的交互,这篇文章讲一下该如何使用。

【嵌入式项目应用】__cJSON在单片机的使用,嵌入式开发,1024程序员节,json,c语言,嵌入式硬件,物联网,单片机,stm32

一、JSON和cJson

  • JSON:全称 JavaScript Object Notation,轻量级的数据格式。
  • cJSON:是一个用c语言编写的JSON数据解析器,超级轻便,可以移植,单文件MIT源协议。

cJSON的源码文件只有两个:

cJSON.c

cJSON.h

下载地址可以在github下载,地址如下:

GitHub - DaveGamble/cJSON: Ultralightweight JSON parser in ANSI C

将这两个文件下载之后,添加到项目中,其它.C文件调用的时候,需要包含头文件cJSON.h即可,文件在MDK中的位置如下:

【嵌入式项目应用】__cJSON在单片机的使用,嵌入式开发,1024程序员节,json,c语言,嵌入式硬件,物联网,单片机,stm32

二、cJSON是如何表示JSON数据的

 cJSON是用一个结构体来表示一个JSON数据,定义在cJSON.h中,查看如下源码:

【嵌入式项目应用】__cJSON在单片机的使用,嵌入式开发,1024程序员节,json,c语言,嵌入式硬件,物联网,单片机,stm32

/* The cJSON structure: */
typedef struct cJSON
{
    /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
    struct cJSON *next;
    struct cJSON *prev;
    /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
    struct cJSON *child;

    /* The type of the item, as above. */
    int type;

    /* The item's string, if type==cJSON_String  and type == cJSON_Raw */
    char *valuestring;
    /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */
    int valueint;
    /* The item's number, if type==cJSON_Number */
    double valuedouble;

    /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
    char *string;
} cJSON;

不是存贮整片的JSON数据,而是按照每条数据进行存储的。使用next指针和prev指针进行链表,存储整片的JSON数据。

三、如何封装完整的JSON数据

说了这么多,我们实际操作一下,找一块STM32F开发板,测试一下。

【嵌入式项目应用】__cJSON在单片机的使用,嵌入式开发,1024程序员节,json,c语言,嵌入式硬件,物联网,单片机,stm32

1. 先将串口打通,方便电脑查看log日志。


uart_init(115200);

2. 增加cjson.c文件,已经在main.c中


#include "cJSON.h"

 【嵌入式项目应用】__cJSON在单片机的使用,嵌入式开发,1024程序员节,json,c语言,嵌入式硬件,物联网,单片机,stm32

3. 准备打包如下的JSON包

{
  "我的名字":  "老刘",
  "公众号":  "数独机",
  "年龄":  11,
  "性别":  "男",
  "电话":  186,
  "地址":  "一般人不告诉",
  "我是嵌套的cJSON":  {
    "号码":  9527,
    "传真":  5510,
    "淘宝店":  "This熏"
  },
  "我是嵌套的数组":  [{
      "我是奇数循环":  0
    }, {
      "我是偶数循环":  "12365"
    }, {
      "我是奇数循环":  2
    }, {
      "我是偶数循环":  "12365"
    }, {
      "我是奇数循环":  4
    }]
}

4. 代码部分,先将几个部分初始化指针

cJSON* main_root = NULL;
    cJSON* main_m_root = NULL;
    cJSON* main_l_root = NULL;
    cJSON* obj=NULL;
    char* response_str = NULL;

5. 创建链表

main_root = cJSON_CreateObject();

 豪横的在链表中添加节点

cJSON_AddStringToObject(main_root, "我的名字", "老刘");
  cJSON_AddStringToObject(main_root, "公众号", "数独机");
  cJSON_AddNumberToObject(main_root, "年龄", 11);
  cJSON_AddStringToObject(main_root, "性别", "男");
  cJSON_AddNumberToObject(main_root, "电话", 186);
  cJSON_AddStringToObject(main_root, "地址", "一般人不告诉");

  main_m_root = cJSON_CreateObject();
  cJSON_AddNumberToObject(main_m_root, "号码", 9527);  
  cJSON_AddNumberToObject(main_m_root, "传真", 5510);
  cJSON_AddStringToObject(main_m_root, "淘宝店", "This熏");
  cJSON_AddItemToObject(main_root, "我是嵌套的cJSON", main_m_root);
 
  main_l_root=cJSON_CreateArray();
  cJSON_AddItemToObject(main_root,"我是嵌套的数组",main_l_root);
  for(i=0;i<5;i++)
  {
    obj=cJSON_CreateObject();
    cJSON_AddItemToArray(main_l_root,obj);
    if(i%2 == 0) cJSON_AddNumberToObject(obj, "我是奇数循环", i);
    else cJSON_AddStringToObject(obj, "我是偶数循环", "12365");
  }

6. 我们查看添加的是否正确,可以将链表通过串口打印出来。

response_str = cJSON_Print(main_root);
  printf("%s\n",response_str);

 7. 效果如下:

【嵌入式项目应用】__cJSON在单片机的使用,嵌入式开发,1024程序员节,json,c语言,嵌入式硬件,物联网,单片机,stm32

四、解包

解包的函数只有一个:


CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value);

还是用例子进行讲解:

将串口的数据完全接收到一个大的缓冲区里面,当然这个数据也可以来自wifi或者网络。


if(GET_STOP_flag)
{
    for(i=0;i<(cJSON_pack_StopP-cJSON_pack_FistP)+1;i++)
    {
      MessageTmp[i] =WIFI_RC_buf[cJSON_pack_FistP-1+i];
    }
}
GET_STOP_flag      //为停止接收标志;
cJSON_pack_StopP   //停止指针位置
cJSON_pack_FistP   //开始指针位置
MessageTmp         //临时的数组

只需要对临时的数组进行操作即可。开辟内存空间,将数组转换为字符串。

MessageStrTmp = (char *)cJSON_malloc(sizeof(char) * (sizeof(MessageTmp) + 1));
strncpy(MessageStrTmp, MessageTmp, sizeof(MessageTmp));

使用解包函数


//接收解包过程        
Thisxun_root      =   cJSON_Parse(MessageStrTmp);
Thisxun_root_type =   cJSON_GetObjectItem(hiss_root,"type")->valuestring;
if(strcmp(Thisxun_root_type,TYPE_USER_INFO_SYNC)==0)
{
  Thisxun_insDetail =   cJSON_GetObjectItem(Thisxun_root,"insDetail");
  userID            =   cJSON_GetObjectItem(Thisxun_insDetail,"userId")->valuestring;
  password          =   cJSON_GetObjectItem(Thisxun_insDetail,"password")->valuestring;
}

五、总结

每次封包和解包结束之后,都要及时释放内存


cJSON_Delete(Thisxun_root);
cJSON_free(MessageStrTmp);

对于单片机而言,需要修改Heap_Size


(* ̄︶ ̄)创作不易!期待你们的 点赞、收藏和评论喔。 

本文来源网络,免费分享知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除!文章来源地址https://www.toymoban.com/news/detail-714133.html

到了这里,关于【嵌入式项目应用】__cJSON在单片机的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 嵌入式项目分享 Stm32 WIFI智能家居温湿度和烟雾检测系统 - 单片机 物联网 嵌入式

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年01月16日
    浏览(140)
  • 【项目设计】基于STM32人脸识别系统 - 单片机 物联网 嵌入式

    项目设计主要是对于所学知识的整体回顾,需要结合各个学科,才能做出达到符合标准的设计。 文章的目的在分享优质的项目以及项目经验,提供设计思路,欢迎交流与指正不足之处。 由于人脸识别技术具有无需接触、安全性高、可靠性高等优点,在身份认证领域具有广阔

    2024年01月21日
    浏览(62)
  • 单片机项目分享 基于stm32的便携用电功率统计系统 -物联网 嵌入式 单片机

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月19日
    浏览(108)
  • 单片机项目分享 stm32机器视觉的口罩佩戴检测系统 - 单片机 物联网 嵌入式

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月22日
    浏览(77)
  • 单片机项目分享 单片机自动写字机器人设计与实现 - 物联网 嵌入式 stm32

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月21日
    浏览(89)
  • 物联网项目分享 stm32实现车牌识别系统 -物联网 嵌入式 单片机

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月21日
    浏览(69)
  • 单片机项目分享 单片机家用燃气的可视化实时监控报警仪 - 物联网 嵌入式 stm32

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月22日
    浏览(70)
  • 物联网项目分享 stm32智能运动计步系统 - 物联网 嵌入式 单片机

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月21日
    浏览(80)
  • 嵌入式项目分享 单片机(stm32)远程智能宠物喂养系统 - 物联网 esp8266

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月21日
    浏览(141)
  • 嵌入式物联网单片机项目开发实例-4G DTU边缘数据采集网关开发

    链接:https://pan.baidu.com/s/163D-kElFqXov629YaSrWDw?pwd=1688 提取码:1688 [1.EC200S_STM32F103_4G CAT1网络TCP和UDP的透传字符串] [2.EC200S_STM32F103_4G CAT1网络TCP和UDP的透传十六进制包含0x00] [3.EC200S_STM32F103_4G CAT1通过外置MQTT协议发送定位和固定数据到ONENET] [4.EC200S_STM32F103_4G CAT1通过外置MQTT协议发送

    2024年01月16日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包