专栏名称: 李白有点儿黑
目录
相关文章推荐
51好读  ›  专栏  ›  李白有点儿黑

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

李白有点儿黑  · CSDN  ·  · 2020-01-01 00:00

正文

基于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)
	{
		
	}
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

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);//开始透传
}	

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

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;
}	

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96

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

结果展示


上图是我试验所得到的结果,之前说过了,我向电脑发送的数据是我自己随便取的一段数字:555。大家可以根据自己的喜好设置数据发送的内容。

在这里插入图片描述
上图是我用到的单片机和WIFI通信模块。

经验总结

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

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

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

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

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

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

源码的链接:https://download.csdn.net/download/qq_50027598/18936540