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的设置值时均会被截断。要根据需显示的内容长度来设置该值。