上篇文章提到了如何使用USB转TTL模块调试ESP8266模块以及该模块的几种工作方式。此篇将会介绍如何实现ESP8266模块与单片机的通信。
功能介绍:esp8266模块与stm32单片机的串口三之间互相通信,本人测试的是esp8266模块的STA做客户端的模式。
与usb转ttl模块调试步骤相同,首先通过AT指令使wifi模块进入sta模式下的透传模式。不同的是,usb转ttl模块调试时我们是通过串口调试助手给其发送AT指令,而此时是需要串口三自动给wifi模块发送AT指令,并判断返回的信息。
直接上代码:
void esp8266_start_trans(void)
{
//设置工作模式:1.station模式 2.AP模式 3,AP+station模式
esp8266_send_cmd("AT+CWMODE=1","OK",500);
//重启模块
esp8266_send_cmd("AT+RST","ready",500);
delay_ms(1000); //ÑÓʱ3SµÈ´ýÖØÆô³É¹¦
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
//让模块连上路由器
while(esp8266_send_cmd("AT+CWJAP=\"xxxx\",\"xxxx\"","WIFI GOT IP",600));
//(此处只需把“xxx"换成自己路由器的名称与密码即可
//设置为单连接模式 0:单连接 1:多连接
esp8266_send_cmd("AT+CIPMUX=0","OK",200);
//是否开启透传模式:1:开启 0:否
esp8266_send_cmd("AT+CIPMODE=1","OK",200);
//建立TCP连接
while(esp8266_send_cmd("AT+CIPSTART=\"TCP\",\"xxx.xxx.xxx.xxx\",xxxx","CONNECT",200));
//透传模式下可以发送数据的指令
esp8266_send_cmd("AT+CIPSEND","OK",50);
}
此函数中有一个重要的函数,就是esp8266_send_cmd();这就是我们自己定义的向esp8266发送命令的函数
//向esp8266发送命令
//cmd:·发送的字符串命令´ack:期待接收到的应答命令;waittime:等待时间
//返回值:0 发送成功 1 发送失败
u8 esp8266_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(esp8266_check_cmd(ack))
{
printf("cmd:%s\r\n",(u8*)cmd);//把发送的命令通过串口一打印到串口调试助手上
printf("ack:%s\r\n",(u8*)ack);//把接收到命令通过串口一打印到串口调试助手上
break;//得到有效数据
}
USART3_RX_STA=0;
}
}
if(waittime==0)res=1;
}
return res;
}
此处可以看到通过u3_printf()函数向esp8266模块发送指定的AT指令,然后判断esp8266返回的命令是否是正确的,并通过串口一的printf()把发送的命令和接收的命令打印到串口调试助手上,方便观察。
下面附上串口三的发送函数
//´串口三发送函数
//确保一次发送数据不超过USART3_MAX_SEND_LEN字节
void u3_printf(char* fmt,...)
{
u16 i,j;
va_list ap;
va_start(ap,fmt);
vsprintf((char*)USART3_TX_BUF,fmt,ap);
va_end(ap);
i=strlen((const char*)USART3_TX_BUF); //´发送数据的长度
for(j=0;j<i;j++) //循环发送数据
{
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //循环发送数据,知道发送完
USART_SendData(USART3,USART3_TX_BUF[j]);
}
}
这是两者之间通信的重要几步,把程序烧录到开发板上,同时打开串口调试助手和网络调试助手。
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021030121323944.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzQ2NTA3OTE4,size_16,color_FFFFFF,t_70#pic_center)
从左侧的串口调试助手上可以观察到发送的AT指令和收到的返回信息,此时模块成功进入到透传模式,即可实现PC端与串口三之间的通信。此时,使用串口调试助手发送消息可以看到网络调试助手上并没有显示对应的消息,这并不代表二者之间通信失败。需要明白,我们配置的是串口三与PC端之间的通信,而串口调试助手实际上是串口一与电脑之间的通信。此时,只需将串口一接收到的数据传递给串口三,再由串口三发送出去即可。同样,当PC端向串口三发送消息时,将串口三接收到的消息通过串口一打印出来,就可以从串口调试助手上观察到了。如图
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210301214140407.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzQ2NTA3OTE4,size_16,color_FFFFFF,t_70#pic_center)
这样我们就可以清晰地观察到二者之间的通信状况。
接下来就要考虑如何退出透传模式了,同样的自定义了退出安透传模式的函数
//退出透传模式 0 退出成功 1 退出失败
//通过wifi模块发送三个连续的“+”退出
u8 esp8266_quit_trans(void)
{
u8 result=1;
u3_printf("+++");
delay_ms(1000);
result=esp8266_send_cmd("AT","OK",20);//退出透传判断
if(result)
printf("quit_trans failed!");
else
printf("quit_trans success!");
return result;
}
在这里,我采用了定时器3计时,如果10s没有接收到消息,就退出透传模式。定时器中断的配置这里就不多说了。
在这里不得不提一下本人在调试过程中遇到的问题:
在第一步中配置esp8266模块进入透传模式时,通过串口调试助手打印出来的信息可以看到程序卡到了“WIFI GOT IP",就是无法进行下一条AT指令,此时打开网络调试助手发送消息显示 ”没有连接对象“,反复观察程序并没有问题。然后就像是不是模块出问题了,我尝试用usb转ttl调试esp8266,发现可以调试成功,证明模块是没有问题的。然后各种网上找答案也没有找到解决办法,然后偶然不经意间发现程序中PC端的IP地址输错了,“174”误输成了“147”,更正后再次调试,成功了。不得不吐糟一下,真是浪费了好长时间。以后在写代码的时候一定要认真在认真! ! !
本人小白一个,文中如有错误还请指正。