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

news2025/3/16 2:29:14

一、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);
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

USART串口通信(stm32)

一、串口通信 通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统 通信协议&#xff1a;制定通信的规则&#xff0c;通信双方按照协议规则进行数据收发 STM32F103C8T6 USART资源&#xff1a; USART1、 USART2、 USART3 自带波特率发生器&…

基于Android studio 使用SQLite数据库完成登录注册功能——保姆级教程

&#x1f345;文章末尾有获取完整项目源码方式&#x1f345; 点击快捷传送地址&#xff1a; 保姆级教学——制作登陆注册功能页面 目录 一、准备工作 二、创建相关文件 三、页面布局 四、DabaHelper帮助类的编写 五、RegisterActivity注册页面 六、LoginActivity登录页面…

【Kafka】消息的顺序性、可靠性、幂等性

目录 消息顺序性消息可靠性生产者丢失消息消费者丢失消息Kafka丢失消息 消息幂等性 消息顺序性 消息追加到partition尾部&#xff0c;单个partition是有序的&#xff0c;但多个partition如何进行有序的获取一些消息&#xff1f; 解决方案 一个topic只设置一个partition&…

深入了解Socket套接字

目录 一、引入&#x1f64c; 1、概念 &#x1f389; 2、分类&#x1f389; Socket 套接字主要针对传输层协议分为流套接字、数据报套接字、原始套接字&#xff08;了解即可&#xff09;三类。 1&#xff09;流套接字&#xff1a;使用传输层TCP协议 2&#xff09;数据报套…

基于Matlab使用BP神经网络进行电力系统短期负荷预测

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 电力系统的短期负荷预测对于电力调度和能源管理具有至关重要的作用。通过准确地预测电力负荷&…

代码随想录算法训练营第三十七天|435. 无重叠区间、763.划分字母区间、56. 合并区间、738.单调递增的数字、968.监控二叉树

435. 无重叠区间 文档讲解&#xff1a;代码随想录 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 本道题与上个题目相似&#xff0c;都是求重叠区间 统计重叠区间的个数&#xff0c;减去重叠区间的个数就是无重叠区间了 主要就是为了让区间尽可能的重叠。&a…

HTML5新特性、JS【初识JS 、JS核心语法】--学习JavaEE的day47

day47 HTML5新特性 定义文档类型 在文件的开头总是会有一个标签 语言文档类型声明方式html4<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">html5<!DOCTYPE html> 新增语义化标签 理解&…

SpringBoot + MybatisPlus

SpringBoot MybatisPlus 整合记录 1. 硬件软件基本信息2. 相关链接3. 通过idea快速生成一个Springboot项目4. 启动报错问题解决问题一&#xff1a;Springboot启动的时候报错提示 “没有符合条件的Bean关于Mapper类型”问题二&#xff1a;启动的时候提示需要一个Bean&#xff0…

民国漫画杂志《时代漫画》第16期.PDF

时代漫画16.PDF: https://url03.ctfile.com/f/1779803-1248612470-6a05f0?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络&#xff01;

Jenkins在windows上进行安装

今天为了实现jmeter接口测试脚本的持续性集成安装了jenkins&#xff0c;主要记录jenkins的安装和端口的修改。 前提条件&#xff1a;安装了jdk&#xff0c;我本机安装的jdk1.8。 1.下载jenkins安装包 安装jenkins我们需要先下载安装包&#xff0c;可以通过下面的链接进行下载&a…

深入理解内联函数(C语言)

目录 1.什么是内联函数2.内联函数与宏3.编译器对内联函数的处理4.参考文献 1.什么是内联函数 很多人都会知道&#xff0c;可以将比较小的函数写成内联函数的形式&#xff0c;这样会节省函数调用的开销&#xff0c;具体是什么样的开销呢&#xff1f; 一个函数在执行过程中&…

低利率之后如何选择?以日本养老金为例

天风证券认为&#xff0c;日本养老金资产配置行为具备的关键特征包括&#xff1a;海外资产占比上升、日元境内资产占比下降&#xff1b;权益类&#xff08;包括境内和境外&#xff09;占比上升&#xff0c;等等。 日本从1990年代开始陷入低增长、低通胀的局面&#xff0c;我们以…

解决win系统msvcp140.dll丢失的多种常用方法,亲测有效!

msvcp140.dll 是一个重要的Windows系统文件&#xff0c;属于Microsoft Visual C Redistributable runtime components的一部分&#xff0c;特别与Visual Studio 2015及之后版本编译的C应用程序相关联。这个动态链接库&#xff08;DLL&#xff09;文件包含了一系列C标准库的功能…

好用的window粘贴板

可以设置指定的快捷键&#xff0c;在需要使用最近复制的记录时快速的复用 -> Ditto。 选择Download即可 地址&#xff1a;Ditto clipboard manager (sourceforge.io)https://ditto-cp.sourceforge.io/

VUE3+Vite+vant4从零开始构建前端项目

VUE3Vitevant4从零开始构建前端项目 1. 环境准备Node.js 安装 2. Vite 构建项目3. 集成Vant41. 安装Vant 组件2. 引入组件3. 使用vant按钮组件 1. 环境准备 Node.js 安装 Node.js官网地址&#xff1a;https://nodejs.p2hp.com/ 下载最新的版本&#xff0c;下载文件为msi结尾的…

用本地大模型(llama3)进行数据分类标记|LLM 用例

001&#xff5c;背景 这是我最新发布的导航站点 https://aiwith.me 这个站点由于第一版数据来源于第三方&#xff0c;只有站点基础数据&#xff0c;没有对数据进行分类&#xff0c;最近站点上线了&#xff0c;主体框架都搭建完成了&#xff0c;这才有空去对数据做分类. 目前的…

Android kotlin协程

说明 可代替线程整异步可控制&#xff0c;灵活 &#xff08;控制优先级&#xff0c;内存占用等&#xff09;速度快 效率高有数量上限 使用 runBlocking 一般用于测试 不建议使用GlobalScope.launch 全局的 生命周期跟随application 不建议使用CoroutineScope(job) 用 基本使…

C结构详解

目录 1、结构模板 1. 建立结构声明 2. 定义结构变量 3. 访问结构成员 4. 初始化结构 声明结构数组 声明和初始化结构指针 1、结构模板 1. 建立结构声明 struct book{char title[MAXTITL];char author[MAXAUTL];float value; }&#xff1b; 该声明描述了一个又两个字符…

指北者智能音乐学习机隆重亮相广州国际乐器展

2024年5月23-26日广州国际乐器展览会在广交会展馆B区隆重开幕&#xff0c;本届展会开设5大展厅、50000平方米的主题展区&#xff0c;吸引了700多家国内外参展商参展&#xff0c;打造集展示、商贸、文化交流、文娱于一体的广阔平台。深圳市指北科技有限公司也携旗下品牌指北者智…

plt多子图设置

import matplotlib.pyplot as plt# 使用 subplots 函数创建一个 2x3 的子图网格 fig, axs plt.subplots(nrows2, ncols3, figsize(16, 10)) # 调整 figsize 来改变图像大小# 遍历每个子图&#xff0c;并绘制一些内容&#xff08;这里只是简单的示例&#xff09; for ax in ax…