簡介
硬件用的是淘寶的上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