【CJSON】嵌入式芯片上基于USB HOST的CJSON文件库移植与应用

news2025/8/3 0:07:37

一 CJSON简介

项目遇到了一个需求,就是需要通过U盘或者其他外接设备,与板子(嵌入式芯片使用的是LPC1857)进行交互。交互的形式有两种:

  1. 一种是预存在外接U盘中的配置信息CFG,接上U盘之后,嵌入式芯片需要自动读取配置文件中的内容并改写自身的运行参数(外接设备配置信息---->主控芯片)。

  1. 一种是嵌入式芯片收集自身的状态信息DATA,接上U盘之后,将收集到的数据打包发送给U盘,便于维护人员对数据进行分析(外接设备<----主控芯片状态信息

现在已经准备好了一个带USB HOST(嵌入式芯片作为USB主机处理外接设备的功能)以及简单的文件系统(文件系统可以参考【文件系统】FatFs文件系统在嵌入式芯片LPC18XX上的移植中的FatFs,这个工程只是做一个简单的DEMO,所以没有使用FatFs)。在此基础上,准备移植一个CJSON库,作为封装上面CFG/DATA信息的数据格式。

CJSON是一个使用C语言编写的JSON数据解析器,具有超轻便,可移植,单文件的特点,使用MIT开源协议。优点就是简单轻便,易于移植,该数据格式还可以灵活适用于网络数据的传输

二 CJSON说明

  1. 数据结构

CJSON的数据结构如下所示:

  1. 基础操作

CJSON的基础操作包括创建、封装、解析、修改、删除。

关于他们的具体用法可以参考这篇文章写的非常详细:C/C++ 使用cjson库 操作Json格式文件(创建、插入、解析、修改、删除)

(特别注意的是:上述操作完成之后一定要释放它们返回的指针内存,否则会造成内存泄漏

三 CJSON移植

  1. 下载

  1. CJSON开源库:https://gitee.com/openharmony/third_party_cJSON/tree/master

  1. CJSON库下载:https://sourceforge.net/projects/cjson/

以上两个地址均可以下载CJSON库。

下载下来之后,拉取其中的cJSON.c/cJSON.h/test.c三个文件,其中前面两个cJSON.c/cJSON.h是库文件必要,最后一个test.c是示例非必要。

  1. 移植

keil中新建目录CJSON,并包含头文件路径:

以上,便移植完成了,就两个文件,简单吧。

四 CJSON应用

下面就是第一章里面提到的两种场景的具体应用:

  1. 外接设备配置信息(cfg.json)---->主控芯片

预存cfg.json文件的内容如下:

这边设计的逻辑就是,在外接U盘加载完毕之后,通过串口Shell命令行输入命令jsi进行文件读取,寻找名为cfg.json的文件,如果找不到,返回“找不到文件”。如果找到,则读取文件内容,并用CJSON进行数据解析,将解析得到的配置数据返回显示(主要涉及CJSON格式的解析操作)。

void shellAnalyseCommand(char * command, short cmdLen)  //命令行解析函数
{
    //...
    //命令1:jsi  读取U盘中的cfd.json文件并解析
    if (((key[0] == 'J') || (key[0] == 'j'))
     && ((key[1] == 'S') || (key[1] == 's'))
     && ((key[2] == 'I') || (key[2] == 'i')))
    {
        shellPrint("数据读取开始...\r\n");
        FAT_FILE_HANDLE hSrc;
        hSrc = fatFileOpen("cfg.json", FAT_FILE_OPEN_READ);
        unsigned long len_s = 0;
        
        if (hSrc == FAT_FILE_HANDLE_NULL)
        {
            shellPrint("找不到文件 \r\n");
            return;
        }
        shellPrint("正在打开文件 %d \r\n", hSrc);
        len_s = fatFileGetLen(hSrc);
        char *out_s = (char *)malloc(len_s+1);
        fatFileRead(hSrc,(unsigned char*)out_s,len_s);
        fatFileClose(hSrc);
        cJSON *cfg = cJSON_Parse(out_s);
        cJSON *item = NULL;
        cJSON *item_typ = NULL;
        cJSON *item_wid = NULL;
        if (!cfg)
        {
            shellPrint("Error before: [%s]\n", cJSON_GetErrorPtr());
            free(out_s);
            return;
        }
        free(out_s);

        item = cJSON_GetObjectItem(cfg, "format");
        item_typ = cJSON_GetObjectItem(item, "type");
        item_wid = cJSON_GetObjectItem(item, "width");
        shellPrint("数据读取完成...\r\n");
        shellPrint("type:%s\r\nwidth:%d\r\n",item_typ->valuestring, item_wid->valueint);
        return;
    }
    //...
}

测试通过命令行jsi可以正确读取:

  1. 外接设备<----主控芯片状态信息(data.json)

这边设计的逻辑就是,在外接U盘加载完毕之后,通过串口Shell命令行输入命令jso进行数据封装,将内部的状态信息打包成CJSON格式的文件,再写入到U盘中(主要涉及CJSON格式的封装操作)。

void shellAnalyseCommand(char * command, short cmdLen)  //命令行解析函数
{
    //...
    //命令2:jso  往U盘中写固定内容data.json文件
    if (((key[0] == 'J') || (key[0] == 'j'))
     && ((key[1] == 'S') || (key[1] == 's'))
     && ((key[2] == 'O') || (key[2] == 'o')))
    {
        shellPrint("数据装载开始...\r\n");
        cJSON *root = NULL;
        cJSON *fmt = NULL;
        char *out = NULL;
        size_t len = 0;
        root = cJSON_CreateObject();
        cJSON_AddItemToObject(root, "name", cJSON_CreateString("Jack"));
        cJSON_AddItemToObject(root, "format", fmt = cJSON_CreateObject());
        cJSON_AddStringToObject(fmt, "type", "rect");
        cJSON_AddNumberToObject(fmt, "width", 100);
        cJSON_AddFalseToObject (fmt, "interlace");
        out = cJSON_Print(root);
        len = strlen(out) + 5;
        shellPrint("数据装载完成...\r\n");
        
        FAT_FILE_HANDLE hDst;
        hDst = fatFileOpen("data.json", FAT_FILE_OPEN_WRITE);
        if (hDst == FAT_FILE_HANDLE_NULL)
        {
            fatMakeFile("data.json");
            hDst = fatFileOpen("data.json", FAT_FILE_OPEN_WRITE);
            shellPrint("没有该文件则新建 %d \r\n", hDst);
        }
        else
        {
            fatFileClear(hDst);
            shellPrint("打开JSON文件 %d \r\n", hDst);
        }
        shellPrint("写json文件开始...\r\n");
        fatFileAppend(hDst, (unsigned char *)out, len);
        fatFileClose(hDst);
        shellPrint("写json文件完成...\r\n");
        free(out);
        cJSON_Delete(root);
        return;
    }
    //...
}

测试通过命令行jsi可以正确读取:

同样的,实际查看U盘中也有该文件:

五 总结

形象地概括来说,CJSON文件库相当于一件衣服,将赤裸的数据套上CJSON大衣(封装)之后出去见人,会更好看,更易识别。但是同样的,读取外部CJSON数据就是脱衣服的过程(解析),抽丝剥茧才能看到最纯粹的数据。在这个循环中,CJSON作为壳,要注意用完就释放,毕竟这件衣服是租来的,用完要还的

综上,通过USB HOST + 串口SHELL命令行 + 文件系统 + CJSON文件库,便可以实现U盘或者其他外接设备,与嵌入式芯片的JSON格式数据交互。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/367643.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【HTTP——了解HTTP协议及状态码】

一&#xff0c; 什么是通信通信&#xff0c;就是信息的传递和交换。通信三要素&#xff1a;通信的主体&#xff0c;通信的内容&#xff0c;通信的方式现实生活中的通信&#xff1a;我打电话叫小明来我家吃饭【其中通信的主体是&#xff0c;我&#xff0c;小明。通信内容是&…

华为OD机试题,用 Java 解【最小施肥机能效】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…

【AI写作】《如何利用 RPA 实现自动化获客?》

写一篇文章《如何利用 RPA 实现自动化获客?》,不少于3000字,使用markdown格式。分10各章节,细化到3级目录。 文章目录 1. 什么是 RPA (Robotic Process Automation)?RPA 的应用场景2. RPA 自动化获客实战2.1 RPA 应该领域2.2 自动化选品 – 电商选品2.3 自动化获客 – 百…

Biome-BGC在模拟过程中,如何使用Linux、Python等,完成前处理和后处理工作???

在Biome-BGC模型中&#xff0c;对于碳的生物量积累&#xff0c;采用光合酶促反应机理模型计算出每天的初级生产力(GPP)&#xff0c;将生长呼吸和维持呼吸减去后的产物分配给叶、枝条、干和根。生物体的碳每天都按一定比例以凋落方式进入凋落物碳库&#xff1b;对于水份输运过程…

【C语言】数据的存储

☃️内容专栏&#xff1a;【C语言】进阶部分 ☃️本文概括&#xff1a; C语言中的数据类型及其存储方式。 ☃️本文作者&#xff1a;花香碟自来_ ☃️发布时间&#xff1a;2023.2.24 目录 一、数据类型详细介绍 1.1 基本的数据类型 1.2 整型家族 1.3 构造类型 1.4 指针类型…

压力传感器MPX5700D/MPX5700GP/MPX5700AP产品概述、特征

MPX5700系列压阻式换能器是最先进的单片硅压力传感器&#xff0c;可广泛用于各种应用&#xff0c;特别是采用A/D输入微控制器或微处理器的应用。这一获得专利的单元件传感器集合了高级微加工技术、薄膜金属化、双极工艺&#xff0c;能够提供精确的、与所施加压力成正比的高电平…

Java面向对象:继承特性的学习

本文介绍了面向对象的继承特性: 什么是继承 继承的概念 Java中继承的语法 在继承下父类成员的访问 super和this关键字 父类和子类构造方法 在继承下类中出现初始化代码的执行顺序 父类成员的访问权限对子类的可见性 Java的继承关系 final关键字 认识继承和组合关系 继承特性的学…

Pytorch学习笔记(7):优化器、学习率及调整策略、动量

目录 一、优化器 1.1 优化器的介绍 1.2 optimizer的属性 1.3 optimizer的方法 1.4 常用优化器 torch.optim.SGD 二、学习率 2.1 学习率介绍 2.2 为什么要调整学习率 2.3 pytorch的六种学习率调整策略 &#xff08;1&#xff09;StepLR &#xff08;2&#xff09;Mu…

linux:http服务器搭建及实验案例

目录准备工作http服务器各个配置文件大概说明实验1&#xff1a;访问不同ip获得不同网页实验2&#xff1a;同一ip访问不同端口获得不同网页准备工作 1&#xff0c;安装http服务 2&#xff0c;将 /etc/selinux/config 文件下面的 SELINUX值改为 disabled 或者 permissive 。 3&a…

如何基于无代码平台实现60个园区、3万台设备的管理?

产业园区的建设是经济发展的集中承载区域。数字化快速发展迭代趋势下&#xff0c;对于一个全国领先的园区综合建设、运营集团来说&#xff0c;对跨园区的监管服务压力也日益增大。特别是随着全国范围内化工、物流、生产等各业态园区快速建设和扩张&#xff0c;园区内消防、安全…

GSEAmining | 来看看你的GSEA结果是不是需要瘦身啦!~

1写在前面 最近真是累的不行&#xff0c;今天抽空写一下新的教程&#xff0c;关于人人都会做的GSEA&#xff08;Gene Set Enrichment Analysis&#xff09;。 但有时候我们做完GSEA后结果实在太多&#xff0c;无法确定其中重要的生物学意义&#xff0c;难以解释。&#x1f928;…

Servlet笔记(4):表单数据

1、Servlet表单数据的方法 GET方法 http://localhost/hello?key1value1&key2value2GET方法有大小限制&#xff1a;请求字符串中最多只能由【1024】个字符 这些信息通过QUERY_STRING头传递&#xff0c;并通过【QUERY_STRING】环境变量访问&#xff0c;Servlet通过【doGet(…

SpringCloud - Gateway网关路由

目录 网关初步介绍 搭建网关服务 路由断言工厂Route Predicate Factory 路由过滤器 GatewayFilter 全局过滤器 GlobalFilter 过滤器执行顺序 网关的cors跨域配置 网关初步介绍 不是所有的请求&#xff0c;都能访问服务&#xff0c;所以需要网关对来访问的请求进行提前判…

归并排序及其应用

归并排序算法基于分而治之的概念&#xff0c;具体来说就是遍历一棵树&#xff0c;归并的过程是一个后序执行的动作。 由于我们知道每个子部分在合并后都是有序的&#xff0c;我们可以利用这个特性来解决一些问题。 上图可视化了merge sort algorithm的过程&#xff0c;我们很容…

2023年:我成了半个外包

边线业务与主线角色被困外包&#xff1b; 012022年&#xff0c;最后一个工作日&#xff0c;裁员的小刀再次挥下&#xff1b; 商务区楼下又多了几个落寞的身影&#xff0c;办公室内又多了几头暴躁的灵魂&#xff1b; 随着裁员的结束&#xff0c;部门的人员结构简化到了极致&am…

Fiddler在ios内的app中抓取https的解决方法

1、安装&设置Fiddler 查看链接---->Fiddler对PC浏览器&安卓App抓包的使用和配置 2、配置完后重启fiddler 3、ios安装证书 3.1、在fiddler右上角这里悬浮鼠标&#xff0c;查看自己电脑IP 或者通过&#xff1a; window键R&#xff0c;输入cmd&#xff0c;在命令行…

java Spring JdbcTemplate 准备工作

查看本文之前 您需要先看我 java Spring的IOC和AOP操作作为基础 如果并不掌握 可以找一下我之前的文章 都有讲到过 接下来的 我们将通过 JdbcTemplate 来做一些数据库操作 那我们就需要对 JdbcTemplate 有个基本的概念 首先 JdbcTemplate 是 Spring对 JDBC的一个很好的封装 通…

哪款蓝牙耳机延迟最低?打游戏零延迟的蓝牙耳机

我知道很多朋友会很在意声音延迟问题&#xff0c;虽然现如今蓝牙5.2甚至5.3已经可以几乎做到零延迟&#xff0c;但毕竟无线传输到现在依然存在或多或少延迟的情况出现&#xff0c;尤其是在这种蓝牙设备密集的地方&#xff0c;信号的干扰是不可避免的&#xff0c;由于技术的迭代…

【数据结构】空间复杂度

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a;初阶数据结构 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对…

免去打包烦恼,自动构建你的GitHub Pages|玩转GitHub Pages三部曲(二)

本文讲述了如何利用 GitHub Actions 来自动构建 GitHub Pages 项目&#xff0c;免去繁琐的手动构建再提交过程&#xff0c;让你专注于写作。大家的点赞和互动是我更文的动力 /(ㄒoㄒ)/ 所以我决定发起一项活动&#xff0c;到三月三十一日统计&#xff0c;留言次数和赞赏次数最多…