WIFI模块,设备联网

1.WIFI模块如何驱动

ESP8266使用:第一种作为mcu开发,再次搭建一下他的环境,开发周期长

第二种利用官方固件使用AT指令(AT+**)开发。

我们原理图中使用的是 ESP12F --ESP8266

       Ai-Thinker蓝牙模块_无线模块_物联网模块_WiFi模块【安信可官网】

       ESP8266系列模组专题 | 安信可科技 (ai-thinker.com)

之前自己绘制的 是使用的ESP8266

       提供 Wi-Fi、蓝牙芯片和 AIoT 解决方案 I 乐鑫科技 (espressif.com.cn)

              AT固件汇总 | 安信可科技 (ai-thinker.com)

       官方资料说明:出厂自带有一个AT固件:支持AT指令的一个程序

       发的任何一个指令:前面都以AT开头

2.ESP8266模块配置

1.开时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);

2.配置GPIO口

GPIO_InitTypeDef GPIO_InitStructure; //根据这个结构体里面参数,初始化对应GPIO端口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //选择管脚10
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速率50mhz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //设置模式为复用推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//选择管脚11
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//设置模式为浮空输入
GPIO_Init(GPIOB, &GPIO_InitStructure);	

3.配置串口 以及设置优先级(串口可以任意选择这里选用串口3)

USART_InitTypeDef USART_InitStruct = {0};//可以通过结构体类型
USART_InitStruct.USART_BaudRate = 115200;//波特率
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//五硬件控制流
USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;//发送器和接收器打开
USART_InitStruct.USART_Parity = USART_Parity_No;//没有奇偶校验
USART_InitStruct.USART_StopBits = USART_StopBits_1;//1个停止位
USART_InitStruct.USART_WordLength = USART_WordLength_8b;//8个数据位
USART_Init(USART3,&USART_InitStruct);

4.使能串口3

USART_Cmd(USART3,ENABLE);
	
	USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);//允许接收中断
	//USART_ITConfig(USART3,USART_IT_IDLE,ENABLE);//允许空闲中断
	NVIC_SetPriority(USART3_IRQn,7);//设置优先级0-15
	NVIC_EnableIRQ(USART3_IRQn);//使能中断通道
	
	//配置EN引脚PE6
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //选择管脚PE6
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速率50mhz
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置模式为复用推挽输出
	GPIO_Init(GPIOE, &GPIO_InitStructure);
	WIFI_ENABLE();
	Delay_nms(500);

接下来进行USART3中断服务函数 不需要调用声明

3.USART3中断服务函数

​
WIFIDATA wifidata={0};//定义全局变量,保存从USART3接收到的数据
//USART3中断服务函数
void USART3_IRQHandler (void)
{
	uint8_t data;
	if((USART3->SR&0x1<<5)!=0){//执行该中断函数的原因有很多,所以判断一下是不是接收导致的
	//接收数据
		data = USART3->DR;//读取接收数据操作,同时也是清空中断标志位的
		wifidata.recvbuf[wifidata.recvcnt] =  data;//将接收的数据放入缓冲区
		wifidata.recvcnt++;//增加接收计数器
		wifidata.recvcnt%=1024;//如果缓冲区已满则从头开始覆盖
		USART1->DR = data;//回显接收到的数据
	}
}

​

接下来创建串口3发送单字节函数 数组函数 字符串函数

4.串口3发送单字节函数 数组函数 字符串函数

//串口3发送单字节函数
void Usart3Senddata(uint8_t data)
{
	//等待发送完成
	while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==0);
	//如果上次发送完成,就发送数据
	USART_SendData(USART3,data);
}
//串口3发送数组函数
void Usart3SendArr(uint8_t * data,uint32_t len)
{
	uint32_t i=0;
	//循环发送数组中的每一个字节
	for(i=0;i<len;i++){
		Usart3Senddata(*data);
		data++;//指针指向下一个元素
	}
}
//串口3发送字符串函数
void Usart3Sendstr(uint8_t * data)
{
	uint32_t i=0;
	//循环直到遇到字符串结束符'\0'
	while(*data!='\0'){
		Usart3Senddata(*data);
		data++;//指针指向下一个元素
	}
}

接下来创建用于发送WIFI命令并等待响应的函数

5.用于发送WIFI命令并等待响应的函数

//用于发送WIFI命令并等待特定响应的函数
uint8_t WifiSendCmd(char * cmd,char * recv,uint32_t timeout)
{
	uint32_t timecnt=0;
	//清除缓冲区
	memset(&wifidata,0,sizeof(wifidata));
	//发送WIFI命令
	Usart3Sendstr((uint8_t*)cmd);
	//等待预期响应或者超时
	while(strstr((char *)wifidata.recvbuf,recv)==NULL){
		timecnt++;
		Delay_nms(1);
		if(timecnt>=timeout){
			printf("发送超时失败%s",cmd);
			return 1;
		}
	}
	printf("发送成功");
	return 0;
}
//连接到指定的IP地址的函数
uint8_t WifiConnectIP(void)
{
	if(WifiSendCmd("AT\r\n","OK",1000) != 0){//测试连接
		return 1;
	}
	if(WifiSendCmd("AT+CWMODE=1\r\n","OK",2000) != 0){//设置工作模式为STA
		return 1;
	}
	if(WifiSendCmd("AT+CWJAP=\"tian\",\"12345678\"\r\n","OK",10000)!= 0){//连接指定WIFI热点
		return 1;
	}
	if(WifiSendCmd("AT+CIPSTART=\"TCP\",\"36.137.226.30\",33451\r\n","OK",10000)!= 0){//开始TCP连接
		return 1;
	}
	if(WifiSendCmd("AT+CIPMODE=1\r\n","OK",1000)!= 0){//设置透传模式
		return 1;
	}
	if(WifiSendCmd("AT+CIPSEND\r\n","OK",1000)!= 0){//准备发发送数据
			return 1;
	}
	return 0;
}

接下来是ESP8266.h

#ifndef _WIFI_H
#define _WIFI_H
#include "stm32f10x.h"
#include "delay.h"
#include "stdio.h"
#include "string.h"
typedef struct{
	uint8_t recvbuf[1024];//定义数组用来存储数据
	uint16_t recvcnt;//介绍数组下标
}WIFIDATA;
#define WIFI_ENABLE() GPIO_SetBits(GPIOE,GPIO_Pin_6)
#define WIFI_DISABLE() GPIO_ResetBits(GPIOE,GPIO_Pin_6)
void Esp8266_Config(void);
void Usart3Sendstr(uint8_t * data);
uint8_t WifiSendCmd(char * cmd,char * recv,uint32_t timeout);
uint8_t WifiConnectIP(void);
#endif

6.WIFI有两种模式:

STA:连接别的设备热点(比如可以连接手机热点)

AP:释放一个热点(手机可以连接他)

发送指令必须包含\r\n

可以通过PC直接测试WIFI模块了

       AT   :测试固件的

       AT+RST        重启ESP8266

       ATE0             关闭回显

       ATE1             打开回显

       AT+CWMODE_DEF=1 (_DEF有些固件支持,有些不支持)设置工作模式  STA模式(可以连接其他设备热点)     2AP模式            3组合模式

       AT+CWJAP_DEF="xyd,"12345678"        连接WIFI

AT+CWSAP—        配置 ESP8266 SoftAP 参数(配置释放的热点)

AT+CIPAP—设置 ESP8266 SoftAP 的 IP 地址

多连接情况下 (AT+CIPMUX=1),才能开启 TCP 服务器。

AT+CIPSERVER—建⽴ TCP 服务器

AT+CIPSTART="TCP","122.114.122.174",39999         以TCP的形式连接服务器

       AT+CIPMODE=1                                           开启透传  //向wifi发送的所有消息(除+++外)都认为不是指令

       AT+CIPSEND                                                 启动发送功能

       +++  没有回车                                             退出透传

       AT+CIPCLOSE                                               退出服务器连接

7.连接服务器需要的步骤

连接网络:

              设置位连接热点模式:STA

连接手机热点:名字和密码

连接服务器 ip 和 端口

收发数据:

              AT是AT指令还是收发的数据

透传模式(透明传输,所有消息都认为是普通收发的消息)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值