最近想实现esp8266-01s系列和stm32f103c8t6之间进行串口通信,然后在网上看了好多这方面的资料最终都以失败告终。不断尝试下还是实现该功能,同时非常感谢这位博主。
博主链接
实现的最终功能是能够通过手机连上ESP8266作为服务端模式下的wifi,让后在手机上发送相关的指令,esp8266接收后再通过串口发送给单片机 ,间接的来控制我们的外设。
esp8266常用指令介绍
具体的用法可以查看相关的esp8266的手册
下面就只介绍一下配置三种不同模式常用的几个指令
模式一:STA模式
//通俗的来讲 该模式就是将esp8266作为客户端 来连接服务端(可以通过我们手机开热点)
1. AT+CWMODE=1 设置模组为STA模式。(串口助手)
2. AT+CWLAP 查询附近 WIFI(串口助手)
3. AT+CWJAP="nova5Pro","yin12345" 连接 WIFI(串口助手)
4. AT+CIFSR 查看路由器分配给模组的IP地址,例如 192.168.43.20(串口助手)
5. AT+CIPMUX=1 打开多连接(串口助手)
6. AT+CIPSERVER=1,8080 设置模块服务器端口(串口助手).
7. 打开网络调试助手进行设置:请打开电脑去连接路由器的WIFI热点。并且打开网络调试助手,在网络调试助手上输入连接模块的 IP和设置的端口。
8. AT+CIPSEND=0,11 进入数据发送模式为11个字节
在电脑终端查看当前Ip ipconfig
记住该Ip在我们配置的时候会使用到 让后通过网络串口助手打开服务端 在使用另外一个串口助手打开就可以观察到我们客户端的启动情况 和 二者之间的数据收发 在esp8266.c中 打开我最开始注释的就可以了
模式二:AP 模式
//AP模式就是让我们的8266模块作为热点 让我们来连接 实现局域网的无线控制
1. AT+CWMODE=2 开启 AP 模式(串口助手)
2. AT+CWSAP="ESP8266","12345678",11,0 设置模块的 wifi 和密码(串口助手)
3. AT+CIPSERVER=1,8080 设置模块服务器端口(串口助手),
4. 打开电脑或者手机上的TCP助手去连接模块建立的AP热点
5. 打开网络调试助手,输入连接模块的 ip 和设置的端口。
6. AT+CIFSR 查看当下的ip
7. AT+CIPSEND=0,11 进入数据发送模式为11个字节(串口助手)
下面串口打印出来的信息就可以观察到我们的配置已经成功了
并且可以看到esp8266作为服务端下的IP,我们通过手机或者网络串口助手连接
输入该IP和我们配置的端口号就可以了
注意:
通信连接
模式三:STA+AP 模式
该模式就是上面两种模式的共存模式,一般没有用到 就不做具体介绍了感兴趣的同学可以自己去试试。
最后在讲一下透传模式
透传模式简单的来说就是实现我们发送的数据,发送什么另一端就接收什么,可以一直发送。
如果不开启透传模式,发送数据前都必须先发送指令AT+CIPSEND=num,
例如T+CIPSEND=4 //发送的数据长度不能大于4 要不然在次发送的时候句处于忙的状态。
AT+CIPMODE=<1> :进入透传模式
AT+CIPSEND :之后发送的所有内容将全部当成数据
注意:透传只能在单连接模式下进行,所以在建立连接之前一定要用(AT+CIPMUX=0 设置单连接)
退出透传模式: 发送数据"+++"就可以了。注意:此时“+++”后面,不接“发送新行”!
c 主程序
/***************************************************/
//该程序还是借鉴前面提到的博主,后面会根据自己功能的需求进行相应的修改
#include "stm32f10x.h"
#include "bsp_usart.h"
#include "delay.h"
#include "led.h"
#include "usart3.h"
#include "string.h"
#include "esp8266.h"
/**
* @brief 主函数
* @param 无
* @retval 无
*/
int main(void)
{
USART_Config();
delay_init();
LED_Init();
usart3_init(115200);
esp8266_start_trans();
printf("初始化完成Start Test\n");
USART3_RX_STA=0;
while(1)
{
if(USART3_RX_STA&0x8000) //如果消息接收完成,则处理
{
if(strstr((const char*)USART3_RX_BUF,"on")) //这里是看接收到的消息中有没有自己设置的命令“on”,strstr()函数不会用的可以搜一下
{
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
}
if(strstr((const char*)USART3_RX_BUF,"off"))
{
GPIO_SetBits(GPIOC,GPIO_Pin_13);
}
USART3_RX_STA=0; //消息处理完成,开始重新接收
memset(USART3_RX_BUF,0,600); //将接收区清0
}
}
}
/*********************************************END OF FILE**********************/
源码链接 链接:https://pan.baidu.com/s/1YwXKHYdV_wxlAYa7eDA7vQ 提取码:avug --来自百度网盘超级会员V4的分享