用cJSON解析心知天气返回的数据包

目录:


后台网友留言,说参考这个链接 天气数据解析1–JSON格式数据 处理天气API接口返回的数据,中间遇到了点问题,里面涉及到的知识:串口通信、JSON字符串咱们之前都有介绍过,那我就借此机会,利用cJSON处理一下这个数据包吧。

调用天气API接口获取天气信息

有时我们的应用想要获取天气预报信息,网上有不少天气预报API提供天气数据服务,我们以心知天气提供的API为例,看看如何使用cJSON解析心知天气API返回的数据包。

  • 心知天气的官网
    https://www.seniverse.com/

  • 申请注册免费版,登陆之后,在控制台–>产品管理下面的我的API项目中,可以查看自己的API密钥的私钥。

在这里插入图片描述

  • 心知天气api:https://api.seniverse.com/v3/weather/now.json?key=key&location=dalian&language=zh-Hans&unit=c

上面加粗的地方,key处替换为你自己的私钥;dalian处替换为你要查询的目标城市;zh-Hans处替换为en就是英文的显示方式了。我们为了OLED显示方便,先使用英文的显示方式。

  • 浏览器中输入API信息得到如下字符串:

在这里插入图片描述

{"results":[{"location":{"id":"WWYMRT0VRMUG","name":"Dalian","country":"CN","path":"Dalian,Dalian,Liaoning,China","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"now":{"text":"Cloudy","code":"4","temperature":"14"},"last_update":"2020-05-22T13:10:00+08:00"}]}

使用在线JSON校验格式化工具,格式化之后,得到如下格式:

在这里插入图片描述

解析天气信息字符串

为了可以动态显示天气信息,我们使用串口发送数据至STM32,用来模拟网络获请求到的数据,然后单片机解析完之后显示到OLED屏上,显示城市信息和天气温度。

以后会写一个使用网络模块实时调用网络上天气信息的例程,敬请留意。

解析过程中出现的问题:

  • 由于STM32F103C8T6单片机的RAM比STM32F103RET6单片机的小,所以按照Keil环境下STM32工程加入cJSON这篇文章添加cJSON库的话,编译会出现如下错误:

在这里插入图片描述

解决办法:
将malloc.h文件中的宏定义更改如下:
原来#define MEM_MAX_SIZE 35*1024
改为#define MEM_MAX_SIZE 16*1024

在这里插入图片描述

  • 另外串口缓冲区要大一点,我串口接收缓冲区大小设置为500字节。

此参数的大小由返回的JSON数据包大小决定,缓冲区大小要比最大的包要大一些才可以。

测试结果

实现的功能:

  1. PC机的串口助手设置比特率为115200,拷贝心知天气api返回的字符串直接串口发送;
  2. STM32F103C8T6单片机的串口1接收上面的字符串,使用cJSON解析此字符串;
  3. 解析之后的结果保存至结构体中暂存;
  4. OLED显示结构体中天气和温度的值。

在这里插入图片描述
在这里插入图片描述

因为一个字符宽度为8px,所以一行可以显示128px/8px=16个字符,使用OLED_ShowStr来显示字符串的话,注意控制字符串长度,如果格式化之后超过16个字符,那么显示会有串行的现象。

欢迎关注

程序员小哈带你玩转嵌入式,微信搜索:嵌入式从0到1,更多干货等着你。
在这里插入图片描述

  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员小哈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值