简介
硬件用的是淘宝的上ESP8266-01模块,使用AT命令,让ESP8266模块上网,进行透传。
这部分参考了正点原子的ATK-ESP8266设计。
F407通过串口3向ESP8266发送6个命令后进入透传模式。分别是
- AT+CWMODE=1,设置为STA模式
- AT+CWJAP,连接WIFI热点
- AT+CIPMUX=0,设置为单连接
- AT+CIPSTART,连接阿里云的mqtt服务器
- AT+CIPMODE=1,开启透传模式
- 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