F407+ESP8266+MQTT+AliIoT(四)——ESP8266开发

F407+ESP8266+MQTT+AliIoT(四)——ESP8266开发

简介

硬件用的是淘宝的上ESP8266-01模块,使用AT命令,让ESP8266模块上网,进行透传。
这部分参考了正点原子的ATK-ESP8266设计。
F407通过串口3向ESP8266发送6个命令后进入透传模式。分别是

  1. AT+CWMODE=1,设置为STA模式
  2. AT+CWJAP,连接WIFI热点
  3. AT+CIPMUX=0,设置为单连接
  4. AT+CIPSTART,连接阿里云的mqtt服务器
  5. AT+CIPMODE=1,开启透传模式
  6. AT+CIPSEND,开始传输数据
    每次发送这6个命令前,最好先运行一下esp8266_quit_trans函数,也就是发送“+++”让ESP8266退出透传模式。

相关程序源码

啥也别说,直接上代码。

esp8266.c

#include "esp8266.h"
#include "string.h"
#include <stdlib.h>

void esp8266_connect_wifi(void)
{    
    // 1.退出透传模式
    esp8266_send_cmd("+++","",300);
    esp8266_send_cmd("\r\n","",300);  //For DEBUG
    delay_ms(1000);
    delay_ms(1000);
    delay_ms(1000); 
    
    // 2.发送AT命令,连接热点
    while(esp8266_send_cmd(CMD_CIPMODE, "OK", 300));
    delay_ms(1000);
    delay_ms(1000);
    delay_ms(1000);
    while(esp8266_send_cmd(CMD_CWJAP, "OK", 500));
    delay_ms(1000);
    delay_ms(1000);
    delay_ms(1000);
    while(esp8266_send_cmd(CMD_CIPMUX, "OK", 300));
    delay_ms(1000);
    delay_ms(1000);
    delay_ms(1000);
}

void esp8266_connect_aliyun(void)
{    
    // 连接阿里云MQTT服务器、进入透传模式
    while(esp8266_send_cmd(CMD_CIPSTART, "OK", 300));
    while(esp8266_send_cmd(CMD_CIPMODE, "OK", 500));
    while(esp8266_send_cmd(CMD_CIPSEND, ">", 300));
    delay_ms(1000);
    delay_ms(1000);
    delay_ms(1000);
}

u8* esp8266_check_cmd(u8 *str)
{	
	char *strx=0;
	if(USART3_RX_STA&0X8000)		//接收到一次数据了
	{ 
		USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符
		strx=strstr((const char*)USART3_RX_BUF,(const char*)str);
	} 
	return (u8*)strx;
}

//向ESP8266发送命令
//cmd:发送的命令字符串
//ack:期待的应答结果,如果为空,则表示不需要等待应答
//waittime:等待时间(单位:10ms)
//返回值:0,发送成功(得到了期待的应答结果)
//       1,发送失败
u8 esp8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
	u8 res=0; 
	USART3_RX_STA=0;
	u3_printf("%s",cmd);	//发送命令
	printf("send: %s",cmd);	//发送命令
	if(ack&&waittime)		//需要等待应答
	{
		while(--waittime)	//等待倒计时
		{
			delay_ms(10);
			if(USART3_RX_STA&0X8000)//接收到期待的应答结果
			{
				if(esp8266_check_cmd(ack))
				{
					printf("ack:%s\r\n",(u8*)ack);
					break;//得到有效数据 
				}
					USART3_RX_STA=0;
			} 
		}
		if(waittime==0)res=1; 
	}
	return res;
} 

//向ESP8266发送指定数据
//data:发送的数据(不需要添加回车了)
//ack:期待的应答结果,如果为空,则表示不需要等待应答
//waittime:等待时间(单位:10ms)
//返回值:0,发送成功(得到了期待的应答结果)luojian
u8 esp8266_send_data(u8 *data,u8 *ack,u16 waittime)
{
	u8 res=0; 
	USART3_RX_STA=0;
	u3_printf("%s",data);	//发送命令
	if(ack&&waittime)		//需要等待应答
	{
		while(--waittime)	//等待倒计时
		{
			delay_ms(10);
			if(USART3_RX_STA&0X8000)//接收到期待的应答结果
			{
				if(esp8266_check_cmd(ack))break;//得到有效数据 
				USART3_RX_STA=0;
			} 
		}
		if(waittime==0)res=1; 
	}
	return res;
}

//ESP8266退出透传模式
//返回值:0,退出成功;
//       1,退出失败
u8 esp8266_quit_trans(void)
{
	while((USART3->SR&0X40)==0);	//等待发送空
	USART3->DR='+';      
	delay_ms(15);					//大于串口组帧时间(10ms)
	while((USART3->SR&0X40)==0);	//等待发送空
	USART3->DR='+';      
	delay_ms(15);					//大于串口组帧时间(10ms)
	while((USART3->SR&0X40)==0);	//等待发送空
	USART3->DR='+';      
	delay_ms(500);					//等待500ms
	return esp8266_send_cmd("AT","OK",20);//退出透传判断.
}

esp8266.h

#ifndef __ESP8266_H__
#define __ESP8266_H__	 
#include "sys.h"
#include "usart.h"	
#include "usart3.h"		
#include "delay.h"	
#include "string.h" 

#define		CMD_CWMODE      "AT+CWMODE=1\r\n"     //设置WIFI STA模式
#define		CMD_CWJAP       "AT+CWJAP=\"热点名称\",\"密码\"\r\n" //连接路由器
#define		CMD_CIPMUX      "AT+CIPMUX=0\r\n" //0:单连接,1:多连
#define		CMD_CIPSTART    "AT+CIPSTART=\"TCP\",\"produckey.iot-as-mqtt.cn-shanghai.aliyuncs.com\",1883\r\n"  //MQTT服务器连接配置  
#define		CMD_CIPMODE     "AT+CIPMODE=1\r\n" //开启透传模式
#define		CMD_CIPSEND     "AT+CIPSEND\r\n"   //开始传输数据

void esp8266_connect_wifi(void);
void esp8266_connect_aliyun(void);

u8 esp8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime);
u8 esp8266_send_data(u8 *data,u8 *ack,u16 waittime);
u8* esp8266_check_cmd(u8 *str);
u8 esp8266_quit_trans(void);

#endif
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值