STM32F103+ESP8266(初始化)——+WIFI模块获取三天天气数据

一、WIFI通信

  1. 选型:选择支持TCP/IP协议的WIFI模块 (这里使用的是ESP8266模组:开发:底层固化软件)

        STM32F103+ESP8266(初始化)——+WIFI模块获取三天天气数据_第1张图片

        1.1)原理图 

                STM32F103+ESP8266(初始化)——+WIFI模块获取三天天气数据_第2张图片

                STM32F103+ESP8266(初始化)——+WIFI模块获取三天天气数据_第3张图片

         使用USART3串口与WIFI模块相连

        2、ESP8266相关AT指令集介绍

        2.1)指令的格式:(AT)开头+数据+(回车+换行)结尾

                串口传输方式:

                默认波特率:115200

                字符串:“AT+数据+换行“

                串口转WIFI

        2.2)指令分类

         STM32F103+ESP8266(初始化)——+WIFI模块获取三天天气数据_第4张图片

        2.3) ESP8266设置的3种无线通信模式

        2.3.1)AP模式:ESP8266产生WIFI网络,其他设备加入该网络(简而言之就是自身充当热点)

        STM32F103+ESP8266(初始化)——+WIFI模块获取三天天气数据_第5张图片

        2.3.2)STA模式(无线终端模式):别人创建WIFI网络,ESP8266加入该网络 -- 局域网通信(连接别人的网络)

                STM32F103+ESP8266(初始化)——+WIFI模块获取三天天气数据_第6张图片

         2.3.3)AP+STA模式(混合模式):

                STM32F103+ESP8266(初始化)——+WIFI模块获取三天天气数据_第7张图片

        2.4) 应用指令

                

命令

功能

备注

AT

测试模块是否正常

基础指令

ATE1/ATE0

开启/关闭回显

AT+CWMODE/AT+CWSAP_DEF

设置AP模式及AP参数

AT WIFI指令

AT +CWMODE=1/AT +CWJAP

设置为Station 模式

AT+CIPSTART

建立TCP连接

AT TCP指令

AT+CIPSEND

发送数据

AT+CIPMODE=1

开启透传传输

+++

退出透传模式

3、 ESP8266初始化代码

  esp8266.c

#include "esp8266.h"


void ESP8266_Config(void)
{
/************************     基本配置      *******************************/
    //1.开时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);
  //2.设置模式  
  GPIO_InitTypeDef GPIO_InitStruct;//定义结构体变量
  
  
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStruct);
  

  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11;
  GPIO_Init(GPIOB, &GPIO_InitStruct);
	
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//复用输出
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
  GPIO_Init(GPIOE, &GPIO_InitStruct);
  
/******************************   usart  ***************************************************/
    //1.开时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
  
  //2.设置模式  
  USART_InitTypeDef USART_InitStructure;
  
  USART_InitStructure.USART_BaudRate = 115200;//波特率
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;//数据位
  USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位
  USART_InitStructure.USART_Parity = USART_Parity_No;//奇偶校验位    ---无
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流
  USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//发送  接收模式

  USART_Init(USART3, &USART_InitStructure);//初始化结构体

  //3.打开串口使能
  USART_Cmd(USART3, ENABLE);
	
	//打开串口中断
	USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);//打开串口接收中断
	
	NVIC_InitTypeDef NVIC_InitStruct;
	NVIC_InitStruct.NVIC_IRQChannel =USART3_IRQn;//中断通道
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;//次优先级
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能中断通道
	NVIC_Init(&NVIC_InitStruct);
}

//发送单字符
void Usart3_Tx(uint8_t data)
{
  //等待上一次数据发送完成
  while(USART_GetFlagStatus(USART3,USART_FLAG_TXE) == 0){}//等待数据发送
    USART_SendData(USART3,data);
}

//发送知道长度字符串
void Usart3_TxStr(u8 *buff,u8 lenth)
{
	for(u8 i=0;iDR;
		USART1->DR = data;
	}
}


 运行结果:发送AT会返回OK

4、获取三天天气

        4.1流程

               首先发送AT检测模块是否连接正常:发送AT   正常返回OK

              然后 设置成程STA模式:AT+CWMODE=1    正常返回OK

              然后连接WIFI:AT+CWJAP=“\"WiFi名\",\"WiFi密码\"     正常返回OK

             连接成功后,建立TCP连接:AT+CIPSTART=\"TCP\",\"api.seniverse.com\",80\r\n

            然后开启透传模式:AT+CIPMODE=1    正常返回OK

           当进入透传模式后,开始发送数据:AT+CIPSEND   出现>时进入透传模式,开始数据传输

            连接知心天气网站的服务器

             数据传输完毕,退出透传模式:+++

            关闭与服务器连接:AT+CIPCLOSE

        4.2TCP/IP协议分层            

        参考OSI模型把所有的TCP/IP系列协议归类到四个抽象层:
  应用层:TFTPHTTPSNMPFTPSMTPDNSTelnet 等等
  传输层:TCPUDP
  网络层:IPICMPOSPFEIGRPIGMP
  数据链路层:SLIPCSLIPPPPMTU
        每一抽象层建立在低一层提供的服务上,并且为高一层提供服务

                STM32F103+ESP8266(初始化)——+WIFI模块获取三天天气数据_第8张图片

                STM32F103+ESP8266(初始化)——+WIFI模块获取三天天气数据_第9张图片

         IP地址:互联网上的每个接口必须有一个唯一的Internet地址(也称作IP地址)。IP地址长32 bit。由于互联网上的每个接口必须有一个唯一的IP地址,因此必须要有一个管理机构为接入互联网的网络分配IP地址。这个管理机构就是互联网络信息中心(Internet Network Information Centre),称作InterNICInterNIC只分配网络号。主机号的分配由系统管理员来负责。

                        STM32F103+ESP8266(初始化)——+WIFI模块获取三天天气数据_第10张图片

          域名:尽管通过IP地址可以识别主机上的网络接口,进而访问主机,但是人们最喜欢使用的还是主机名。在TCP/IP领域中,域名系统(DNS)是一个分布的数据库,由它来提供IP地址和主机名之间的映射信息。

 域名解析:

Dns检测|Dns查询 - 站长工具通过DNS检测可以快速查出不同的地区不同的网络对你的域名解析速度,及域名DNS信息http://tool.chinaz.com/dns/

 端口号:

TCPUDP采用16 bit的端口号来识别应用程序。那么这些端口号是如何选择的呢?

服务器一般都是通过知名端口号来识别的。例如,对于每个TCP/IP实现来说,FTP服务器的TCP端口号都是21,每个Telnet服务器的TCP端口号都是23,每个TFTP(简单文件传送协议)服务器的UDP端口号都是69。任何TCP/IP实现所提供的服务都用知名的11023之间的端口号。这些知名端口号由Internet号分配机构(Internet Assigned Numbers Authority, IANA)来管理。

客户端通常对它所使用的端口号并不关心,只需保证该端口号在本机上是唯一的就可以了。客户端口号又称作临时端口号(即存在时间很短暂)。这是因为它通常只是在用户运行该客户程序时才存在,而服务器则只要主机开着的,其服务就运行。

        大多数TCP/IP实现给临时端口分配10245000之间的端口号。大于5000的端口号是为其他服务器预留的(Internet上并不常用的服务)。我们可以在后面看见许多这样的给临时端口分配端口号的例子。

        查询公共端口号:网络常用端口号大全----2_福哥哥哥的博客-CSDN博客_host2-ns常用端口1.公认端口(Well Known Ports):从0到1023,它们紧密绑定于一些服务。通常这些端口的通讯明确表明了某种服务的协议。例如:80端口实际上总是HTTP通讯。2. 注册端口(Registered Ports):从1024到49151。它们松散地绑定于一些服务。也就是说有许多服务绑定于这些端口,这些端口同样用于许多其它目的。例如:许多系统处理动态端口从1024左右开始。3. 动态和/或私有端口(Dynamic and/or Private Ports):从49152到65535https://blog.csdn.net/liufuliang163/article/details/107605228        4.3HTTP协议

  

 STM32F103+ESP8266(初始化)——+WIFI模块获取三天天气数据_第11张图片

4.4cJSON格式

cJSON作为Json格式的解析库,其主要功能无非就是构建和解析Json格式了,用途就是一端将要发送的数据已cjson形式封装,然后发送,另一端收到此数据后,还是按cjson形式解析,就得到想要的数据了。

        4.4.1封装成JSON格式       

                首先,创建json数据串。这数据串可能是对象,也可能是数组,也可能是它们的各种组合,其中再加上一些键值对。

                注意:它们的组合,符合父子继承格式。这也是json数据串的特点。

        1)创建一个对象,并向这个对象里添加字符串和整型键值:

#include
#include
#include
#include"cJSON.h"
 
int main()
{
        cJSON * usr;//定义JSON数据对象的名字
 
        usr=cJSON_CreateObject();   //创建根数据对象
        cJSON_AddStringToObject(usr,"name","Lu");  //加入键值,加字符串
        cJSON_AddStringToObject(usr,"passwd","123");
        cJSON_AddNumberToObject(usr,"num",1);  //加整数
        
        char *out = cJSON_Print(usr);   //将json形式打印成正常字符串形式
        printf("%s\n",out);//打印字符串
       
        // 释放内存  
        cJSON_Delete(usr);  
        
        
}

打印效果:

 {
    "name":    "Lu",
    "passwd":    "123",
    "num":    1
}

         2)创建一个数组并在数组里添加字符串和数字

int create_js(void)
{
    cJSON *root, *js_body;
    root = cJSON_CreateArray();//创建数组
    cJSON_AddItemToArray(root, cJSON_CreateString("Hello world"));//创建字符串
    cJSON_AddItemToArray(root, cJSON_CreateNumber(10)); //创建数字
    {
        char *s = cJSON_PrintUnformatted(root);
        if(s)
        {
            printf(" %s \n",s);
            free(s);
        }
    }
    if(root)
    cJSON_Delete(root);
 
    return 0;
 
}
 
int main(int argc, char **argv)
{
    create_js();
    return 0;
}

        运行结果:["Hello world",10] 

        4.4.2JSON数据格式解析

          流程:1:解析数据包的过程刚好和封装数据包的过程相反 , 先将普通的json串处理成json对象,也就是所谓的创建json root的过程,只有一行代码即可

 cJSON *root;
root = cJSON_Parse(js_string);

                2:开始拿关键字,但如果关键字还有父层或者祖层,那就需要先从父层开拿。

        out={\"name\":\"Lu\",\"passwd\":\"123\",\"num\":1}

#include
#include
#include
#include"cJSON.h"
 
int main()
{
    cJSON *json,*json_name,*json_passwd,*json_num;
    char* out="{\"name\":\"fengxin\",\"passwd\":\"123\",\"num\":1}";
 
    json = cJSON_Parse(out); //解析成json形式
    json_name = cJSON_GetObjectItem( json , "name" );  //获取键值内容
    json_passwd = cJSON_GetObjectItem( json , "passwd" );
    json_num = cJSON_GetObjectItem( json , "num" );
 
    printf("name:%s,passwd:%s,num:%d\n",json_name->valuestring,json_passwd->valuestring,json_num->valueint);
 
    cJSON_Delete(json);  //释放内存 
    free(out);
}

显示结果:

        name:fengxin,passwd:123,num:1 

 

先说没有父层的:

 

char *s = "{\"list\":{\"name\":\"xiao hong\",\"age\":10},\"other\":{\"name\":\"hua hua\"}}";
cJSON *root = cJSON_Parse(s);
if(!root) //返回值不为0
{
    printf("get root faild !\n");
    return -1;
}
 
cJSON *js_list = cJSON_GetObjectItem(root, "list");
if(!js_list) 
{
    printf("no list!\n");
    return -1;
}
printf("list type is %d\n",js_list->type);
 
cJSON *name = cJSON_GetObjectItem(js_list, "name");
if(!name) 

{
    printf("No name !\n");
    return -1;
}
printf("name type is %d\n",name->type);
printf("name is %s\n",name->valuestring);
 
cJSON *age = cJSON_GetObjectItem(js_list, "age");
if(!age) 
{
    printf("no age!\n");
    return -1;
}
printf("age type is %d\n", age->type);
printf("age is %d\n",age->valueint);
 
cJSON *js_other = cJSON_GetObjectItem(root, "other");
if(!js_other) 
{
    printf("no list!\n");
    return -1;
}
printf("list type is %d\n",js_other->type);
 
cJSON *js_name = cJSON_GetObjectItem(js_other, "name");
if(!js_name) 
{
    printf("No name !\n");
    return -1;
}
printf("name type is %d\n",js_name->type);
printf("name is %s\n",js_name->valuestring);
 
if(root)
    cJSON_Delete(root);
    return 0;

显示结果:

 list type is 6
name type is 4
name is xiao hong
age type is 3
age is 10
list type is 6
name type is 4
name is hua hua 

获取三天天气的代码:

esp8266.c

#include "esp8266.h"
#include "delay.h"
#include "stdio.h"
#include "string.h"
#include "usart1.h"
#include "cJSON.h"
#include "stdlib.h"

WIFI wifi = {0};
Weather_Message message[3] = {0};

void Usart3_Config(void)
{
    //打开GPIO口的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure={0};//定义结构体 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//推挽输出
	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化结构体
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //引脚
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //引脚
	GPIO_Init(GPIOE, &GPIO_InitStructure);	
	
    //打开串口时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
	USART_InitTypeDef USART_InitStructure={0}; 
	USART_InitStructure.USART_BaudRate = 115200; //波特率4800  9600  115200
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//数据位  8位 
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位 1位
	USART_InitStructure.USART_Parity = USART_Parity_No;//校验位  无
	USART_InitStructure.USART_HardwareFlowControl = 
	USART_HardwareFlowControl_None;//不使用硬件流控制	
	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//发送 接收 
	USART_Init(USART3, &USART_InitStructure);
		
	USART_Cmd(USART3,ENABLE);//使能串口3
	
	NVIC_InitTypeDef NVIC_InitStruct = {0};
	NVIC_InitStruct.NVIC_IRQChannel= USART3_IRQn;//中断通道
	NVIC_InitStruct.NVIC_IRQChannelCmd= ENABLE;//使能
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;//占先
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;//次级
	NVIC_Init(&NVIC_InitStruct);
	
	USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);//打开串口接收中断
	USART_ITConfig(USART3,USART_IT_IDLE,ENABLE);//打开串口空闲中断
	
	GPIO_SetBits(GPIOE,GPIO_Pin_6);
//拉高---因为使用的板子原有个上拉电阻,但是实际使用的没有了,所以手动上拉

}

void Usart3_Tx(uint8_t ch)
{
	while(!USART_GetFlagStatus(USART3,USART_FLAG_TXE));
	USART_SendData(USART3,ch);	
}

void Usart3_TxStr(char *buff)
{
	while(*buff != '\0')
	{
		Usart3_Tx(*buff);
		buff++;
	}
}

void Usart3_TxBuff(char *buff,uint8_t lenth)
{
	for(uint8_t i=0;iDR;	
		wifi.RxBuff[wifi.RxNum++] = data;
		USART1->DR = data;
		//wifi.RxNum++;
		
	}
	if(USART_GetITStatus(USART3,USART_IT_IDLE)==1)
	{
		//清除空闲中断标志
		data = USART3->SR;
		data = USART3->DR;
		
		wifi.Rx_Over=1;//接收标志位
	}
}

/**
 * 功能:查找字符串中是否包含另一个字符串
 * 参数:
 *       dest:待查找目标字符串
 *       src:待查找内容
 *       timeout: 查询超时时间
 * 返回值:查找结果  返回所查找字符串在整体字符串中的位置
 *						 = NULL  没有找到字符串		查找失败
 */
char * FindStr(char* dest, char* src, uint32_t timeout)
{
	while(timeout-- && strstr(dest, src) == NULL)
		Delay_ms(1);
	return strstr(dest, src);
}


/**
 * 功能:ESP8266发送指令获取应答
 * 参数:
 *       cmd -- 指令字符串
 *       ack -- 应答字符串
 *       timeout -- 应答溢出时长
 *			 check_cnt -- 循环发送指令的次数(可能模组没反应过来,多发几次)
 * 返回值:0 -- 成功		>0 -- 失败
 */
uint8_t ESP8266_SendCmd_RecAck(char *cmd, char *ack, uint32_t timeout, uint8_t check_cnt)
{
	uint32_t len = strlen((char *)cmd);
	//清空缓冲区
	wifi.RxNum = 0;
	memset(wifi.RxBuff, 0, sizeof(wifi.RxBuff));	
	do{
		//发送命令
		if(cmd != NULL){
			Usart3_TxBuff((char *)cmd, len);
		}
		//等待命令返回值
		if(ack != NULL){
			if(FindStr((char *)wifi.RxBuff, ack, timeout) != NULL) //等待串口接收应答,并解析
			{
				wifi.RxNum = 0;
				return 0;//接收到正确应答
			}
		}
	}while(--check_cnt);
	return 1;//失败
}



uint8_t num=0;
void Get_Weather(void)
{
	uint8_t recv=0;
	cJSON *root,*results,*object,*location,*now,*daily,*array = NULL;
	switch(num)
	{
		case 0: recv =  ESP8266_SendCmd_RecAck("AT\r\n","OK",1000,2);
						if(recv==0) num++;
		break;
		case 1:  recv =  ESP8266_SendCmd_RecAck("AT+CWMODE=1\r\n","OK",1000,2);
						if(recv==0) num++;

		break;
		case 2:  recv =  ESP8266_SendCmd_RecAck("AT+CWJAP=\"xyd\",\"12345678\"\r\n","OK",10000,2);
						if(recv==0) num++;
			
			break;
		case 3:  recv =  ESP8266_SendCmd_RecAck("AT+CIPSTART=\"TCP\",\"api.seniverse.com\",80\r\n","OK",10000,2);
						if(recv==0) num++;
			break;
		case 4:    recv =  ESP8266_SendCmd_RecAck("AT+CIPMODE=1\r\n","OK",10000,2);
						if(recv==0) num++;
			
			break;
		case 5:  recv =  ESP8266_SendCmd_RecAck("AT+CIPSEND\r\n",">",10000,2);
						if(recv==0) num++;
			break;
		case 6: 
			wifi.RxNum = 0;
			Usart3_TxStr("GET https://api.seniverse.com/v3/weather/now.json?key=SesTZfjXlyk3yVjEW&location=zhengzhou&language=en&unit=c\r\n");
         num++;Weather[1]=3000;
		
		break;
		case 7:
			     Weather[1]=1000;
		       {
						 printf("接收到的数据为:%s\r\n",wifi.RxBuff);
						  root = cJSON_Parse((char *)wifi.RxBuff);
						 if(root ==NULL)
							{
								printf("第一天root 失败\r\n"); 
								cJSON_Delete(root);
								num++;
								return ;
							}
							 results = cJSON_GetObjectItem(root,"results");
							if(results ==NULL)
							{
								printf("results 失败\r\n"); 
								cJSON_Delete(root);
								num++;return ;
							}
							 object  = cJSON_GetArrayItem(results,0);
							if(object ==NULL)
							{
								printf("object 失败\r\n"); 
								cJSON_Delete(root);
								num++;return ;
						  }
							 location = cJSON_GetObjectItem(object,"location");
							 now = cJSON_GetObjectItem(object,"now");
							
							message[0].now_tem = atoi(cJSON_GetObjectItem(now,"temperature")->valuestring);
							message[0].now_code = atoi(cJSON_GetObjectItem(now,"code")->valuestring);
							strcpy((char *)&(message[0].now_text[0]),cJSON_GetObjectItem(now,"text")->valuestring);
							strcpy((char *)&(message[0].now_name[0]),cJSON_GetObjectItem(location,"name")->valuestring);

							printf("位置:%s\r\n",cJSON_GetObjectItem(location,"name")->valuestring);
							printf("天气:%s\r\n",cJSON_GetObjectItem(now,"text")->valuestring);
							printf("温度:%s\r\n",cJSON_GetObjectItem(now,"temperature")->valuestring);	
						
					    cJSON_Delete(root);
					 }
					 num++;
			break;
		case 8:
			wifi.RxNum = 0;
			Usart3_TxStr("GET https://api.seniverse.com/v3/weather/daily.json?key=SesTZfjXlyk3yVjEW&location=zhengzhou&language=en&unit=c&start=0&days=3\r\n");
      num++;Weather[1]=3000;
		  break;
		
		case 9:
			Weather[1]=1000;
		       {
						 printf("接收到的三天数据为:%s\r\n",wifi.RxBuff);
						 root = cJSON_Parse((char *)wifi.RxBuff);
						 if(root ==NULL)
							{
								printf("第一天root 失败\r\n"); 
								cJSON_Delete(root);
								num++;
								return ;
							}
							 results = cJSON_GetObjectItem(root,"results");
							if(results ==NULL)
							{
								printf("results 失败\r\n"); 
								cJSON_Delete(root);
								num++;return ;
							}
							object  = cJSON_GetArrayItem(results,0);
							if(object ==NULL)
							{
								printf("object 失败\r\n"); 
								cJSON_Delete(root);
								num++;return ;
						  }
							 location = cJSON_GetObjectItem(object,"location");
							 daily = cJSON_GetObjectItem(object,"daily");
							
							 array = NULL;
							for(uint8_t i=0;i<3;i++)
							{
								array  = cJSON_GetArrayItem(daily,i);
								
							
								message[i].day_code= atoi(cJSON_GetObjectItem(array,"code_day")->valuestring);
								message[i].night_code = atoi(cJSON_GetObjectItem(array,"code_night")->valuestring);
								message[i].High_tem = atoi(cJSON_GetObjectItem(array,"high")->valuestring);
								message[i].Low_tem = atoi(cJSON_GetObjectItem(array,"low")->valuestring);

								printf("第%d天\r\n",i+1);
								printf("白天天气代码:%d\r\n",message[i].day_code);
				  			printf("晚上天气代码:%d\r\n",message[i].night_code);
								printf("最高温:%d\r\n",message[i].High_tem);
								printf("最低温:%d\r\n",message[i].Low_tem);
							}
					    cJSON_Delete(root);
					 }
					 num++;
		  break;					 
					 
		case 10:Usart3_TxStr("+++");num++;
			break;
		case 11:recv =  ESP8266_SendCmd_RecAck("AT+CIPCLOSE\r\n","OK",10000,2);
						if(recv==0) num=3;
			break;
		
	}
	

esp8266.h代码

#ifndef _ESP8266_H_
#define _ESP8266_H_


#include "stm32f10x.h"

typedef struct{
	
	uint8_t RxBuff[1024];//数据接收存放的数组
	uint16_t RxNum;//接收
	uint8_t Rx_Over;//接收满的标志位
}WIFI;

typedef struct{
  uint8_t now_name[30];//城市
	uint8_t now_text[30];//天气文本
	uint16_t now_code;//天气代码
	uint16_t now_tem;//温度
	
	uint8_t day_text[30];
	uint8_t day_code;
	uint8_t night_text[30];
	uint8_t night_code;
	
	uint16_t High_tem;//最高温
	uint16_t Low_tem;//最低温
	
	uint16_t rainfall;//降雨量
	
}Weather_Message;


void Usart3_Config(void);
void Usart3_TxStr(char *buff);
void Usart3_TxBuff(char *buff,uint8_t lenth);
void Get_Weather(void);
#endif

你可能感兴趣的:(stm32,单片机,arm)