当前位置:网站首页>基于STM32F407的WIFI通信(使用的是ESP8266模块)
基于STM32F407的WIFI通信(使用的是ESP8266模块)
2022-08-05 05:15: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)
{
}
}
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;
}
至于其余的文件都是一些常规的配置文件,这里就不多说了,如果想要源码添加我的联系方式私聊我即可。
结果展示

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

上图是我用到的单片机和WIFI通信模块。
经验总结
本人实现这个功能前前后后花了将近一个月,学到了很多东西,可能对于大佬来说,我现在做的都算不上什么,不过对于我这个单片机入门水平的小白来说,感慨还是挺多的。
1.首先,就是一定要保证你的单片机是可以正常运行的,WIFI通信模块(本人使用的是正点原子的ESP28266模块,性能还是可以的)。可以用一个USB转TTL进行指令操作,判断ESP8266模块是否能正常运行(因为最近要忙着准备电赛,这个我过一段时间会再发布一个对应的指令调试教程)
2.其次,一定要多阅读代码。我是查阅了CSDN上几乎所有的相关代码,各种修改,删减,浓缩成现在这个样子。目前我这个代码放眼整个CSDN应该算是最精简的了(当然,不排除某些牛逼的大佬可以做到更加精简),你们可以在我这个代码的基础上添加各种功能,如果不需要,你就可以直接拿来用了。
3.你只有看懂了,才能拿来用,所以最好不要放过任何一个疑问,说不定这个疑问就是解决问题的关键。
4.最后在强调一下我这部分代码实现的功能:由单片机向电脑或手机传送数据(你们需要在电脑或手机下载一个网络调试助手)。或者自己开发一个APP用来接收数据。如果你们想要双向数据传输,可自行添加修改代码,这里我就不便多说了。可以说我提供的这段代码算是最最基础的,你们可以在这个基础上做一些“上层建筑”,都是可以的。
5.最后的最后,支持还是要支持一下的,请求各路英雄豪杰多多打赏,多多关注,多多点赞,我是只发布高质量文章的李白有点儿黑。
源码的链接:https://download.csdn.net/download/qq_50027598/18936540
边栏推荐
- 用GAN的方法来进行图片匹配!休斯顿大学提出用于文本图像匹配的对抗表示学习,消除模态差异!
- CVPR2020 - 自校准卷积
- 【数据库和SQL学习笔记】7.SQL中的插入(INSERT)、删除(DELETE)、更新(UPDATE)
- AIDL detailed explanation
- flink yarn-session的两种使用方式
- IJCAI 2022|边界引导的伪装目标检测模型BGNet
- ES6 新特性:Class 的继承
- 表情捕捉的指标/图像的无参考质量评价
- 【论文阅读-表情捕捉】ExpNet: Landmark-Free, Deep, 3D Facial Expressions
- [Practice 1] Diabetes Genetic Risk Detection Challenge [IFLYTEK Open Platform]
猜你喜欢
![[After a 12] No record for a whole week](/img/05/df9aeb04274e308e1341020f836821.jpg)
[After a 12] No record for a whole week

Lecture 3 Gradient Tutorial Gradient Descent and Stochastic Gradient Descent

神经网络也能像人类利用外围视觉一样观察图像

IDEA 配置连接数据库报错 Server returns invalid timezone. Need to set ‘serverTimezone‘ property.

IJCAI 2022|边界引导的伪装目标检测模型BGNet

Day1:用原生JS把你的设备变成一台架子鼓!

Tensorflow踩坑笔记,记录各种报错和解决方法

【Multisim仿真】直流稳压电源设计报告

解决:Unknown column ‘id‘ in ‘where clause‘ 问题

【论文精读】R-CNN 之预测框回归(Bounding box regression)问题详述
随机推荐
npm搭建本地服务器,直接运行build后的目录
服务网格istio 1.12.x安装
Map、WeakMap
Flink和Spark中文乱码问题
Mesos learning
MSRA proposes extreme masking model ExtreMA for learning instances and distributed visual representations
原来何恺明提出的MAE还是一种数据增强
哥廷根大学提出CLIPSeg,能同时作三个分割任务的模型
ECCV2022 | RU & Google propose zero-shot object detection with CLIP!
记我的第一篇CCF-A会议论文|在经历六次被拒之后,我的论文终于中啦,耶!
el-table,el-table-column,selection,获取多选选中的数据
Oracle压缩表修改字段的处理方法
Flutter 3.0升级内容,该如何与小程序结合
CVPR 2020 - 频谱正则化
Flink Broadcast 广播变量
【数据库和SQL学习笔记】3.数据操纵语言(DML)、SELECT查询初阶用法
【NFT开发】设计师无技术基础保姆级开发NFT教程在Opensea上全套开发一个NFT项目+构建Web3网站
ES6基础语法
CVPR2020 - 自校准卷积
【零基础开发NFT智能合约】如何使用工具自动生成NFT智能合约带白名单可Mint无需写代码