基于STM32F407的WIFI通信(使用的是ESP8266模块)

基于STM32F407的WIFI通信(使用的是ESP8266模块)

本次做的是WIFI通信所实现的功能是:由单片机端向客户端发送数据。模式:STA模式(及连接路由器的方式)。(所实现的功能比较简单,只是单方向发送,测试5次,每次均成功,非常稳定,代码也非常简洁)。废话不多说,直接上代码。

(本次上传的代码对于比较懂的仁兄已经够用,如果还有仁兄想要参考完整的源码,可加我微信:wpt666aaa 或QQ:2036795517),这个很方便的。

主要代码

主函数部分:

#include "sys.h"
#include "delay.h"  
#include "usart.h"   
#include "usmart.h"  	
#include "usart3.h"
#include "common.h" 
#include "esp8266.h"

int main(void)
{
             
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
	delay_init(168);  //初始化延时函数
	uart_init(115200);		//初始化串口波特率为115200
	usart3_init(115200);  //初始化串口3波特率为115200
	
	
	esp8266_start_trans();
	delay_ms(1000);
	esp8266_send_data("555",100);//像我这里,发送的数据就是555,你可以设置成其它你想要的数据
	atk_8266_quit_trans();
	while(1)
	{
     
		
	}
}

esp8266.c文件

void esp8266_start_trans(void)
{
     
    atk_8266_send_cmd("AT+CWMODE=1","OK",50);
    atk_8266_send_cmd("AT+RST","ready",100);	
	delay_ms(1000);
	delay_ms(1000);
	delay_ms(1000);
	delay_ms(1000);
	while(atk_8266_send_cmd("AT+CWJAP=\"WPT\",\"123456789\"","WIFI GOT IP",800));//这里连得是我本人用手机开的热点
	atk_8266_send_cmd("AT+CIPMUX=0","OK",30);
	while(atk_8266_send_cmd("AT+CIPSTART=\"TCP\",\"192.168.43.63\",8080","OK",180));
	atk_8266_send_cmd("AT+CIPMODE=1","OK",180);
	atk_8266_send_cmd("AT+CIPSEND","OK",60);//开始透传
}	

common.c文件

//ATK-ESP8266发送命令后,检测接收到的应答
//str:期待的应答结果
//返回值:0,没有得到期待的应答结果
//    其他,期待应答结果的位置(str的位置)
u8* atk_8266_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;
}


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



//ATK-ESP8266退出透传模式
//返回值:0,退出成功;
//       1,退出失败
u8 atk_8266_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 atk_8266_send_cmd("AT","OK",20);//退出透传判断.
}


//数据发送函数
u8* esp8266_send_data(u8 *cmd,u16 waittime)
{
     
	
	char temp[5];
	char *ack=temp;
	USART3_RX_STA=0;
	u3_printf("%s",cmd);
	if(waittime)
	{
     
			
		    while(--waittime)
			{
     
				delay_ms(10);
				if(USART3_RX_STA&0X8000)
				{
     
					
					USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;
					ack=(char*)USART3_RX_BUF;
					printf("ack:%s\r\n",(u8*)ack);
					USART3_RX_STA=0;
					break;	
				}	
			}	
	}
	return(u8*)ack;
}	

至于其余的文件都是一些常规的配置文件,这里就不多说了,如果想要源码添加我的联系方式私聊我即可。

结果展示

基于STM32F407的WIFI通信(使用的是ESP8266模块)_第1张图片
上图是我试验所得到的结果,之前说过了,我向电脑发送的数据是我自己随便取的一段数字:555。大家可以根据自己的喜好设置数据发送的内容。

基于STM32F407的WIFI通信(使用的是ESP8266模块)_第2张图片
上图是我用到的单片机和WIFI通信模块。

经验总结

本人实现这个功能前前后后花了将近一个月,学到了很多东西,可能对于大佬来说,我现在做的都算不上什么,不过对于我这个单片机入门水平的小白来说,感慨还是挺多的。

1.首先,就是一定要保证你的单片机是可以正常运行的,WIFI通信模块(本人使用的是正点原子的ESP28266模块,性能还是可以的)。可以用一个USB转TTL进行指令操作,判断ESP8266模块是否能正常运行(因为最近要忙着准备电赛,这个我过一段时间会再发布一个对应的指令调试教程)

2.其次,一定要多阅读代码。我是查阅了CSDN上几乎所有的相关代码,各种修改,删减,浓缩成现在这个样子。目前我这个代码放眼整个CSDN应该算是最精简的了(当然,不排除某些牛逼的大佬可以做到更加精简),你们可以在我这个代码的基础上添加各种功能,如果不需要,你就可以直接拿来用了。

3.你只有看懂了,才能拿来用,所以最好不要放过任何一个疑问,说不定这个疑问就是解决问题的关键。

4.最后在强调一下我这部分代码实现的功能:由单片机向电脑或手机传送数据(你们需要在电脑或手机下载一个网络调试助手)。或者自己开发一个APP用来接收数据。如果你们想要双向数据传输,可自行添加修改代码,这里我就不便多说了。可以说我提供的这段代码算是最最基础的,你们可以在这个基础上做一些“上层建筑”,都是可以的。

5.最后的最后,支持还是要支持一下的,请求各路英雄豪杰多多打赏,多多关注,多多点赞,我是只发布高质量文章的李白有点儿黑。

你可能感兴趣的:(物联网,单片机,串口通信,物联网,wifi)