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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章