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=SSID,PASSWORD,,\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);
}

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值