PY32F003+RTL8710(AT) 实现获取天气情况

一、RTL8710主要AT指令

1、ATSR:模块重启

2、ATSE=1:开启回显

3、ATPW=1:station模式

4、ATPN=ssid,password,,:连接到AP

5、ATPK=1:设置自动接收

6、ATPC=0,v1.yiketianqi.com,80:与网站建立TCP连接

7、ATPT=125,1:GET /api?unescape=1&version=v61&appid=此处替换成自己的ID&appsecret=此处替换成自己的key HTTP/1.1\r\nHost: v1.yiketianqi.com:80\r\nConnection: close\r\n

向天气API网站发送调用API的url请求,以获取天气信息

二、PY32F003+RTL8710(AT) 实现

main.c

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "string.h"
#include "Lcd_Driver.h"
#include "LCD_calculate.h"
#include "rtl8710ATcmd.h"

/* Private define ------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
UART_HandleTypeDef UartHandle;
uint8_t aTxBuffer[12] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
uint8_t aRxBuffer[2048] = {0xff};
uint8_t recvByte;
int rx_count=0;			//接收计数
uint8_t dataReceived=0;


/* Private user code ---------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/


void RTL8710_USART_Config(void)
{

	UartHandle.Instance          = USART2;		//AF9:PA0(TX),PA1(RX)
  UartHandle.Init.BaudRate     = 38400;
  UartHandle.Init.WordLength   = UART_WORDLENGTH_8B;
  UartHandle.Init.StopBits     = UART_STOPBITS_1;
  UartHandle.Init.Parity       = UART_PARITY_NONE;
  UartHandle.Init.HwFlowCtl    = UART_HWCONTROL_NONE;
  UartHandle.Init.Mode         = UART_MODE_TX_RX;
  if (HAL_UART_Init(&UartHandle) != HAL_OK)
  {
    APP_ErrorHandler();
  }
}


/**
*
*
*/
void RTL8710_UART_Send(uint8_t *str)
{
	uint8_t ch;
	while(*str!=0){
		ch=*str;
		HAL_UART_Transmit(&UartHandle, (uint8_t *)&ch, 1, 200);
		str++;
	}
}

uint8_t* RTL8710_UART_Recieve()
{
	uint8_t ch;
	int i=0;
	if(HAL_UART_Receive(&UartHandle, (uint8_t *)&ch, 1, 1000)==HAL_OK){
		aRxBuffer[i++]=ch;
	}
	aRxBuffer[i]='\0';
  return aRxBuffer;
}


/*
	处理接收buffer的信息
*/
void processRxBuffer(void)
{
	printf("接收到的信息:[%s]\r\n",aRxBuffer);
	extract_all_from_json(aRxBuffer);
	dataReceived=0;
}
/**
  * @brief  应用程序入口函数.
  * @retval int
  */
int main(void)
{
	
  /* systick初始化 */
  HAL_Init();
	
  Lcd_Init();
  Lcd_Clear(RED);               //清屏
	
  /* USART初始化 */
  RTL8710_USART_Config();

  HAL_Delay(1000); 
	
	/* DEBUG USART初始化 */
	BSP_USART_Config();
	HAL_Delay(1000);

	/*通过中断方式接收数据*/
  if (HAL_UART_Receive_IT(&UartHandle, (uint8_t *)&recvByte, 1) != HAL_OK)
  {
    APP_ErrorHandler();
  }
	
	RTL8710_UART_Send((uint8_t*)"ATSR\r\n");	//restart
	HAL_Delay(2000); 
	printf("ATSR\r\n");
	Gui_DrawFont_GBK16(0,0,WHITE,RED,"ATSR");
	
	RTL8710_UART_Send((uint8_t*)"ATSE=1\r\n");	//0关闭回显
	HAL_Delay(2000); 
	printf("ATSE=1\r\n");
	Gui_DrawFont_GBK16(0,0,WHITE,RED,"ATSE");
	
	RTL8710_UART_Send((uint8_t*)"ATPW=1\r\n");		//1:station ;2:ap
	HAL_Delay(1000); 
	printf("ATPW=1\r\n");				//station
	Gui_DrawFont_GBK16(0,0,WHITE,RED,"ATPW=1");


	
	RTL8710_UART_Send((uint8_t*)"ATPN=lion,sujingliang,,\r\n");	
	HAL_Delay(10000); 
	printf("ATPN=\"ssid\",password,,\r\n");			//连接到wifi AP
	Gui_DrawFont_GBK16(0,0,WHITE,RED,"CONNECT AP");
	

	createTCPClient();
	
	RTL8710_UART_Send((uint8_t*)"ATPK=1\r\n");
	HAL_Delay(1000); 
	printf("ATPK=1\r\n");		//建立自动接收
	Gui_DrawFont_GBK16(0,0,WHITE,RED,"ATPK=1");
	
	
	getDataFromApi();

   /*通过中断方式发送数据*/

	processRxBuffer();
  while (1)
  {
	/* 延时500ms */
    HAL_Delay(500);  
  }
}

/**
  * @brief  USART错误回调执行函数
  * @param  huart:USART句柄
  * @retval 无
  */
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{

	if((huart==&UartHandle)&&(huart->ErrorCode!=HAL_UART_ERROR_NONE))
	{
		printf("Uart Error, ErrorCode = %d\r\n", huart->ErrorCode);

    if(__HAL_UART_GET_FLAG(huart,UART_FLAG_ORE) != RESET) 
    {
        __HAL_UART_CLEAR_OREFLAG(huart);
        while(HAL_UART_Receive_IT(&UartHandle, &recvByte, 1)!=HAL_OK){
					UartHandle.RxState = HAL_UART_STATE_READY;
					__HAL_UNLOCK(&UartHandle);
				}
    }
	}
}

/**
  * @brief  USART发送回调执行函数
  * @param  huart:USART句柄
  * @retval 无
  */
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *UartHandle)
{
  if (HAL_UART_Receive_IT(UartHandle, (uint8_t *)aRxBuffer, 12) != HAL_OK)
  {
    APP_ErrorHandler();
  }
}

/**
  * @brief  USART接收回调执行函数
  * @param  huart:USART句柄
  * @retval 无
  */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *Handle)
{
  /*通过中断方式接收数据*/

	
	if(Handle->Instance==USART2)
	{
		printf("%c", recvByte);
		
		if(rx_count<2047){
			if(dataReceived==0){
				aRxBuffer[rx_count++]=recvByte;					//rx_count>100丢弃
			}
		}
		if((0x0A==aRxBuffer[rx_count-1])&&(0X0D==aRxBuffer[rx_count-2]))
		{
			aRxBuffer[rx_count]='\0';
		 
			if(strstr((char*)aRxBuffer,"{\"cityid\":")){
				dataReceived=1;
			}
			rx_count=0;
		}
		
	
		while(HAL_UART_Receive_IT(&UartHandle, &recvByte, 1)!=HAL_OK){
			UartHandle.RxState = HAL_UART_STATE_READY;
			__HAL_UNLOCK(&UartHandle);
		}
		
	}
}

/**
  * @brief  错误执行函数
  * @param  无
  * @retval 无
  */
void APP_ErrorHandler(void)
{
  /* 无限循环 */
  while (1)
  {
  }
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  输出产生断言错误的源文件名及行号
  * @param  file:源文件名指针
  * @param  line:发生断言错误的行号
  * @retval 无
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* 用户可以根据需要添加自己的打印信息,
     例如: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* 无限循环 */
  while (1)
  {
  }
}
#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT Puya *****END OF FILE******************/
#include <main.h>
#include <string.h>
#include "rtl8710ATcmd.h"
#include "Lcd_Driver.h"
#include "LCD_calculate.h"


struct CITY_WEATHER{
	char date[11];
	char city[20];
	char	wea[5];
	char	tem[6];
}city_weather;


extern void RTL8710_UART_Send(uint8_t *str);

void createTCPClient(void)
{
	RTL8710_UART_Send((uint8_t*)"ATPC=0,v1.yiketianqi.com,80\r\n");	
	Gui_DrawFont_GBK16(0,0,WHITE,RED,"createTCPClient");
	HAL_Delay(2000); 
}


void getDataFromApi(void)
{
	RTL8710_UART_Send((uint8_t*)"ATPT=125,1:GET /api?unescape=1&version=v61&appid=17769781&appsecret=5IbudTJx HTTP/1.1\r\nHost: v1.yiketianqi.com:80\r\nConnection: close\r\n\r\n");	
	Gui_DrawFont_GBK16(0,0,WHITE,RED,"getDataFromApi");
	HAL_Delay(5000); 
	//printf("ATPT=125,1:GET /api?unescape=1&version=v61&appid=17769781&appsecret=5IbudTJx HTTP/1.1\r\nHost: v1.yiketianqi.com:80\r\nConnection: close\r\n\r\n");	
}


void extract_item_from_json(const char *json_str,char *itemname,char *target)
{
	char *start = strstr(json_str, itemname); // 查找"cityEn":"  
	char *end;
	size_t len=20;
	char item[20]; // +1 for null terminator

	 if (start != NULL) {  
        start += strlen(itemname); // 跳过itemname 
        end = strchr(start, '"'); // 查找下一个双引号  
        if (end != NULL) {  
            // 提取  
            len = end - start;  
            strncpy(item, start, len);  
            item[len] = '\0'; // 添加字符串结束符  
            printf("Item: %s\n", item);  

			strncpy(target, item, len);
			target[len] = '\0'; // 添加字符串结束符 

		    
        }  
    } else {  
        printf("Item[%s] not found in the JSON string.\n",itemname);  
    }  
}

void extract_all_from_json(const char *json_str)
{
	extract_item_from_json(json_str,"\"cityEn\":\"",city_weather.city);
	extract_item_from_json(json_str,"\"tem\":\"",city_weather.tem);
	extract_item_from_json(json_str,"\"date\":\"",city_weather.date);
	
	Lcd_Clear(BLACK);  
	Gui_DrawFont_GBK16(0,0,WHITE,BLACK,"    Weather    ");
	Gui_DrawFont_GBK16(2,20,BLUE,BLACK,"City:");
	Gui_DrawFont_GBK16(45,20,YELLOW,BLACK,city_weather.city);
	
	Gui_DrawFont_GBK16(2,40,BLUE,BLACK,"Temp:");
	Gui_DrawFont_GBK16(45,40,YELLOW,BLACK,city_weather.tem);
	
	Gui_DrawFont_GBK16(2,60,BLUE,BLACK,"Date:");
	Gui_DrawFont_GBK16(45,60,YELLOW,BLACK,city_weather.date);
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis(1)-Jedis连接配置

问题 阿里云安装并启用Redis后&#xff0c;尝试在本地用Jedis调用&#xff0c;发现报错 public class Jedis01 {Testpublic void connect(){Jedis jedis new Jedis("101.37.31.211", 6379); // 公网ipjedis.auth("123"); // 密码String ping jedis.pin…

Offline RL : Context-Former: Stitching via Latent Conditioned Sequence Modeling

paper 基于HIM的离线RL算法&#xff0c;解决基于序列模型的离线强化学习算法缺乏对序列拼接能力。 Intro 文章提出了ContextFormer&#xff0c;旨在解决决策变换器&#xff08;Decision Transformer, DT&#xff09;在轨迹拼接&#xff08;stitching&#xff09;能力上的不足…

【控制实践——二轮平衡车】【三】基于PID的直立控制

传送门 系列博客前言直立运动分析基于PID控制器的直立控制角度环控制角速度控制总结 电机转速的控制前言电机转速控制 结语 系列博客 【控制实践——二轮平衡车】【一】运动分析及动力学建模 【控制实践——二轮平衡车】【二】实物设计和开源结构&代码 【控制实践——二轮…

题目----力扣--回文链表

题目 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为 回文链表 。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;…

Vue3实战笔记(42)—Vue + ECharts:流量数据可视化的强大组合

文章目录 前言vue3使用echarts标准demo&#xff1a;总结 前言 在前端开发中&#xff0c;数据可视化已经成为了一个不可或缺的部分。Vue.js作为一个轻量级且易于上手的渐进式JavaScript框架&#xff0c;与ECharts这个强大的数据可视化库的结合&#xff0c;使得在Vue应用中构建交…

叶面积指数(LAI)数据、NPP数据、GPP数据、植被覆盖度数据获取

引言 多种卫星遥感数据反演叶面积指数&#xff08;LAI&#xff09;产品是地理遥感生态网推出的生态环境类数据产品之一。产品包括2000-2009年逐8天数据&#xff0c;值域是-100-689之间&#xff0c;数据类型为32bit整型。该产品经过遥感数据获取、计算归一化植被指数、解译植被类…

几个速度比较快的 Linux 开源镜像站及支持的资源列表

搜狐开源镜像站 https://mirrors.sohu.com/ File Name CPAN/ FreeBSD/ QpenBSD/ RockyL apache/ archlinux/ centos/ ceph/ cygwin/ debian/ debian–cd/ debian-security/ deepin/ deepin-cd/ docker-ce/ fedora/ fedora-epel/ gentoo/ lib/ mysql/ nginx/ opensuse/ php/ ubu…

房地产支持政策加码不断,美克家居全力变革未来可期

2023年我国经济处于恢复发展阶段&#xff0c;而家具制造业“回温”速度明显慢于经济增速&#xff0c;在这一背景下&#xff0c;美克家居如此营收表现并不令人感到意外。而在充沛现金流支撑下&#xff0c;辅以全方位开展降本增效的年度经营规划&#xff0c;公司亏损收窄或已为期…

Doris集群安装部署

Doris集群安装部署 一、环境搭建 1、环境准备 主机名IP角色doris1192.168.100.131Frotend,Backenddoris2192.168.100.132Backenddoris3192.168.100.133Backend 2、Doris整体架构 Frontend&#xff08;FE&#xff09; 主要负责用户请求的接入、查询解析规划、元数据的管理…

插件:NGUI

一、版本 安装完毕后重启一下即可&#xff0c;否则可能创建的UI元素不生效 二、使用 Label文字 1、创建Canvs 2、只有根节点的这些脚本全部展开才能鼠标右键创建UI元素 3、选择字体 Sprite图片 1、选择图集 2、选择图集中的精灵 Panel容器 用来装UI的容器&#xff0c;一般UI…

汇编:加减乘除指令

加法指令 (ADD) ADD指令用于将两个操作数相加&#xff0c;结果存储在第一个操作数中。 语法&#xff1a; ADD destination, source 示例&#xff1a; assume cs:code ​ code segmentmov ax,3mov bx,2add ax,bx //相加&#xff0c;结果会放在ax中mov ax,4c00hint 21h co…

Training-Free Consistent Text-to-Image Generation # 论文阅读

URL https://arxiv.org/pdf/2402.03286 TL;DR 2024 年 2 月 nvidia 的文章。提出了一种不需要任何额外训练的主体保持方法&#xff0c;可以一次生成的 batch 中&#xff0c;通过多个 prompt 生成对应的多张图片&#xff0c;这些图片都可以拥有一个主体。 本文提出的方法通过…

怎么判断同步时序逻辑电路和异步时序逻辑电路?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

基于Python卷积神经网络的Mnist手写数字识别

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 手写数字识别是机器学习和计算机视觉领域中的一个经典问题。Mnist数据集是一个包含大量手写数…

ACW石子合并-XMUOJ元素共鸣:唤醒神之眼 -区间DP

题目 思路 话不多说&#xff0c;直接上代码 代码 /* ACW石子合并-XMUOJ元素共鸣&#xff1a;唤醒神之眼 JinlongW-2024/05/25 区间DP 当i<j时&#xff0c;f[i][j]min(f[i][k]f[k][j]s[j]-s[i-1]) 当ij时&#xff0c;f[i][j]0 最终答案&#xff1a;f[1][n] *//* 区间DP…

[图解]SysML和EA建模住宅安全系统-07 to be块定义图

1 00:00:01,970 --> 00:00:05,040 入侵者这里有个∞ 2 00:00:05,530 --> 00:00:07,000 说明它下面已经有子图了 3 00:00:07,010 --> 00:00:08,080 我们看看里面子图 4 00:00:10,200 --> 00:00:17,000 这里&#xff0c;我们看位置 5 00:00:19,030 --> 00:00:…

BWVS 靶场测试

一、PHP弱类型 is_numeric() 输入&#xff1a;127.0.0.1/BWVS/bug/php/code.php # 1、源代码分析 如果num不是数字&#xff0c;那么就输出num&#xff0c;同时如果num1&#xff0c;就输出flag。即num要是字符串又要是数字 # 2、函数分析&#xff1a; is_numeric()函数&…

一文通晓mysql

目录 1.mysql在centos7环境上的安装 2.数据库基础 1. 什么是数据库 2.基本认识 3.库的操作 1.创建数据库 2.查看数据库列表 3.删除数据库 4.修改数据库 5.库的备份与修复 4.表的操作 1.创建表 2.查看表 3.修改表 修改表名 给表增加属性。 修改表中的某个属性&…

Android Gradle开发、应用、插件发布(六)—实现打包自动复制文件插件

1. 前言 项目中遇到了一个问题 : 其中一个模块MyLibrary的assets文件夹中&#xff0c;需要存放很多文件(每个文件对应一个功能)。 这样导致的问题是MyLibrary打出的这个aar包体积特别大。 如果把MyLibrary严谨地拆解成若干个Module又比较费时&#xff0c;对于现在业务现状来…