因为项目使用到了网络,与服务进行http通讯,所以选择了使用json方式。
单片机通过串口与wifi模块,获取网络上的数据包,根据字符串处理拿到传输的json字符。
在单片机上处理json的方式简单发现了3种,开始用了frozen,在使用过程发现总在调用free()函数的时候卡死;
百度了一通,发现要把 head 的大小设置大一点。从512到8196,发现都不行,进而想是不是rt-thread嵌太深,
把栈撑坏了,又把栈给加大,也是在处理完一次json后死掉。
随想换一种方式解析,看看keil软件给自带了一种方式,网上推荐的还有 cJSON。去MDK官网下载支持包,
发现既有 jsmn 也有 cJSON的,前者网上只发现了打包的案例,加上又去掉了。所以最后用的是 cJSON的
方式,这种方式的案例网上有很多。按着搞了,也是不行,差不多与使用frozen遇到的情况一样。
看网上的都是自己构建json字符然后解析的。自己的是直接获取自己从服务器上返回的数据。我的json也没
毛病啊。随也简单构建了一个json自己写在单片机的代码上。发现可以了。想到自己从服务器上返回的json
包含整型数据。在串口打印的时候,整形数据没有被双引号引起。在服务器上把整形两边加上双引号,
解析成功。然后 ato() 方法把字符转换为整型,再用 %d 输出,嗯,就这样没啥毛病。这个坑让我试了两个方案,
花掉半个下午的时间。
// json_start = "{\"msg\":\"OK\",\"status\":\"200\"}";
json = cJSON_Parse(json_start);
if(json == NULL){ // printf("get json err..\r\n");
}else{
cJSON* item = cJSON_GetObjectItem(json,"status");
printf("status:%d\r\n",atoi(item->valuestring));
// cJSON_Delete(item);
cJSON_Delete(json);
printf("get json ok..\r\n");
}