室内环境检测系统
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

220 lines
5.2 KiB

#include "wifi.h"
#include "string.h"
#include "delay.h"
///////////////串口基本设置//////////////////
///////////////////////////////////////////////
///////////////////////////////////////////////
///////////////////////////////////////////////
/************* 本地变量声明 **************/
char Uart3_Buf[Buf3_Max];//串口2接收缓存
u8 First_Int = 0;
//串口3初始化
void USART3_init(u32 bound)
{
//GPIO端口设置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能USART3,GPIOB时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //使能USART3,GPIOB时钟
//USART3_TX GPIOB10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB
//USART3_RX GPIOB11初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PB11
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB
//Usart3 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
//USART3 初始化设置
USART_InitStructure.USART_BaudRate = bound;//串口波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
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_Rx | USART_Mode_Tx; //收发模式
USART_Init(USART3, &USART_InitStructure); //初始化串口3
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启串口接受中断
USART_Cmd(USART3, ENABLE); //使能串口3
}
void USART3_IRQHandler(void) //串口3中断服务程序
{
u8 Res=0;
Res = USART_ReceiveData(USART3);
Uart3_Buf[First_Int] = Res; //将接收到的字符串存到缓存中
First_Int++; //缓存指针向后移动
if(First_Int >= Buf3_Max) //如果缓存满,将缓存指针指向缓存的首地址
{
First_Int = 0;
}
}
//清除串口缓存数据
void CLR_Buf(void)
{
u16 k;
for(k=0;k<Buf3_Max;k++) //将缓存内容清零
{
Uart3_Buf[k] = 0x00;
}
First_Int = 0; //接收字符串的起始存储位置
}
//发送字符串
void UART3_SendString(char* s)
{
while(*s)//检测字符串结束符
{
while(USART_GetFlagStatus(USART3, USART_FLAG_TC)==RESET);
USART_SendData(USART3 ,*s++);//发送当前字符
}
}
//发送命令
void UART3_Send_Command(char* s)
{
CLR_Buf(); //清空接收数据的buffer
UART3_SendString(s); //发出字符串
UART3_SendString("\r"); //再自动发送 \r\n两个字符
}
//寻找字符串
//返回:1 已找到 0 未找到
u8 Find(char *a)
{
if(strstr(Uart3_Buf, a)!=NULL)
{
return 1;
}
else
{
return 0;
}
}
//发送AT指令
//*b:需要发送的字符串
//*a:查找是否返回的字符串
//wait_time:发送的次数
//interval_time:每次等待的时间
u8 UART3_Send_AT_Command(char *b,char *a,u8 wait_time,u32 interval_time)
{
u8 i;
i = 0;
while(i < wait_time) //如果没有找到 就继续再发一次指令 再进行查找目标字符串
{
UART3_Send_Command(b);//串口2发送 b 字符串 他会自动发送\r\n 相当于发送了一个指令
delay_ms(interval_time); //等待一定时间 传50的话就是 50*20ms = 1秒
if(Find(a)) //查找需要应答的字符串 a
{
return 1;
}
i++;
}
return 0;
}
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
//设置WIFI模块模式
//多连接 AP 接入点名称 密码 通道号 WPA2_PSK
signed ESP8266_wifi_Init(void)
{
u8 ret;
ret = UART3_Send_AT_Command("AT\r\n","OK",3,100); //检测模块是否存在
delay_ms(600);
if(ret == 0)
{
return -1;
}
ret = UART3_Send_AT_Command("AT+CWMODE=2\r\n","OK",3,100); //设置模块为AP模式
delay_ms(600);
if(ret == 0)
{
return -2;
}
ret = UART3_Send_AT_Command("AT+CWSAP=\"ZH\",\"123456789\",5,3\r\n","OK",3,100); //设置接入点名称 密码 通道号 WPA2_PSK
delay_ms(600);
if(ret == 0)
{
return -3;
}
ret = UART3_Send_AT_Command("AT+CIPMUX=1\r\n","OK",3,100); //设置为多连接
delay_ms(600);
if(ret == 0)
{
return -4;
}
ret = UART3_Send_AT_Command("AT+CIPSERVER=1,5000\r\n","OK",3,100); //设置模块为TCP服务器,端口号为5000
delay_ms(600);
if(ret == 0)
{
return -5;
}
ret = UART3_Send_AT_Command("AT+CIPSTO=0\r\n","OK",3,100); //设置超时时间为0
delay_ms(600);
if(ret == 0)
{
return -6;
}
return 0;
}
//发送数据
//*buf:需要发送的字符串
void ESP8266_send_data(char *buf)
{
UART3_Send_AT_Command("AT+CIPSEND=0,14\r\n",">",3,50); //发送通道号,以及需要发送的字符个数
delay_ms(200);
UART3_SendString(buf);
delay_ms(100);
}