RT-Thread 中使用cJSON软件包几个常见错误

OS:win7

RT-Thread Studio: 版本: 1.1.0  构建ID: 202005291500

rt-thread:4.0.2

使用cJSON有几个小问题,记录之。

   RT-Thread Studio 1.1.0是刚发布的版本,需重新安装。手上有STM32F407ZGT6开发板,做个cJSON的试验。(1.1.0 发布版本默认加载了F1,F4的SDK芯片支持包,其它系列需要在SDK Manager中安装对应SDK包)

1、创建项目

新建RT-Thread项目,相关选项如下图:

2、添加cJSON软件包

双击项目下RT-Thread settings,在软件包->IoT - internet of things 下添加cJSON,选中Value中的单选框,点击前面的三角展开,选中Version为latest。然后点击保存。 RT-Thread Studio会自动下载选中的软件包。

3、错误1:unknow type name 'size_t'

添加cJSON软件包后,编译项目,会提示如下size_t错误:

在cJSON.h 中增加stdlib.h头文件。

再次编译,上述size_t错误提示消失。但出现如下错误。

4、错误2: undefined reference to 'floor'

新错误如下:

提示未定义的floor函数。其原因是在cJSON.c中使用了floor函数,需要在编译时增加-lm参数。在RT-Thread Studio中增加该选项的设置方法如下:

点击构建配置选项图标,如下图红框中:

按下图步骤,选择 c/C++构建 -> 设置 -> 工具设置 -> Cross ARM C Linker -> Libraries , 然后点击3处图标,在出现的界面中输入字符m,然后确定

再次编译,编译成功,如下图。

至此CJSON软件包才算真正添加成功。接下来即可进行CJSON的相关操作。

5、错误3:用cJSON_Print() 打印到调试串口,内容被截断,显示不全

        有如下代码片段,发现使用cJSON_PrintUnformatted() 通过调试串口可完全显示cJSON内容,此时p的长度是253。但使用cJSON_Print() 调试串口只能显示部分内部,还有部分内容显示不出来。     

    p = cJSON_PrintUnformatted(json_root);
    rt_kprintf("\r\n PrintUnformatted len = %d\r\n ", rt_strlen(p));
    rt_kprintf(p);
    rt_kprintf("\r\n");
    rt_free(p);

    p = cJSON_Print(json_root);
    rt_kprintf("\r\n");
    rt_kprintf("\r\n Print len = %d\r\n ", rt_strlen(p));
    rt_kprintf(p);
    rt_free(p);

    cJSON_Delete(json_root);

      该问题的原因是,当调用cJSON_Print()函数时,会格式化cJSON内容,会在字符串中增加\t, \n 等,以格式化显示,方便查看。但p的长度增加到了273

     在rtconfig.h文件中,查看调试串口的配置参数如下,其中RT_CONSOLEBUF_SIZE的值为256,刚好满足   253 < 256 < 273

因此上述使用cJSON_Print()时,其字符串长度为273,因此显示不全。 

   将 RT_CONSOLEBUF_SIZE 的值改为512

再次编译运行,cJSON_Print() 的内容可以正常全部显示出来了。

此处 RT_CONSOLEBUF_SIZE 值的大小跟cJSON没有直接关系。任何需要通过调试串口显示的字符串长度大于RT_CONSOLEBUF_SIZE的设置值时均会被截断。要根据需显示的内容长度来设置该值。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UC/OS-II 是一个实时操作系统,而 cJSON 是一个轻量级的 JSON 解析器和生成器库。如果你想在 UC/OS-II 使用 cJSON,你需要将 cJSON 的源代码添加到你的项目,并进行相应的配置。 以下是在 UC/OS-II 使用 cJSON 的一般步骤: 1. 将 cJSON 的源代码添加到你的 UC/OS-II 项目。可以将 cJSON 的源文件(cJSON.c 和 cJSON.h)直接复制到你的项目目录,或者将其放在一个单独的文件夹,并将该文件夹添加到你的项目的 include 路径。 2. 在你的 UC/OS-II 任务包含 cJSON 头文件,并在任务初始化的地方进行 cJSON 的初始化。例如,你可以在任务初始化函数调用 `cJSON_Init()` 函数来初始化 cJSON: ```c #include "cJSON.h" void YourTask(void *p_arg) { // 初始化 cJSON cJSON_Init(); // 其他任务代码... } ``` 3. 在你的任务使用 cJSON 解析和生成 JSON 数据。你可以使用 cJSON 的 API 来解析和生成 JSON 数据。例如,使用 `cJSON_Parse()` 函数解析 JSON 字符串,使用 `cJSON_CreateObject()` 和 `cJSON_AddItemToObject()` 函数创建和添加 JSON 对象等。 以下是一个简单的例子,演示了如何使用 cJSON 解析和生成 JSON 数据: ```c #include "cJSON.h" void YourTask(void *p_arg) { cJSON *root = NULL; char *jsonStr = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}"; // 解析 JSON 字符串 root = cJSON_Parse(jsonStr); if (root != NULL) { // 从 JSON 对象获取字段值 cJSON *name = cJSON_GetObjectItem(root, "name"); cJSON *age = cJSON_GetObjectItem(root, "age"); cJSON *city = cJSON_GetObjectItem(root, "city"); if (name != NULL && age != NULL && city != NULL) { // 打印字段值 printf("Name: %s\n", name->valuestring); printf("Age: %d\n", age->valueint); printf("City: %s\n", city->valuestring); } // 释放 cJSON 对象 cJSON_Delete(root); } // 生成 JSON 对象 cJSON *newRoot = cJSON_CreateObject(); cJSON_AddStringToObject(newRoot, "name", "Alice"); cJSON_AddNumberToObject(newRoot, "age", 25); cJSON_AddStringToObject(newRoot, "city", "London"); // 将 JSON 对象转换为字符串 char *newJsonStr = cJSON_Print(newRoot); if (newJsonStr != NULL) { printf("New JSON string: %s\n", newJsonStr); free(newJsonStr); } // 释放 cJSON 对象 cJSON_Delete(newRoot); // 其他任务代码... } ``` 这只是一个简单的示例,你可以根据你的具体需求使用其他 cJSON 的 API 来解析和生成 JSON 数据。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值