个人从局域网内调试ESP8266开始就碰了一堆壁,在此总结一下,希望可以帮到看到这篇文章的人,关键性细节问题详情请见第五部分
注:仅以STA模式为例
第一部分:描述
STM32通过ESP8266连接无线路由器访问阿里云服务器并实现透传
第二部分:硬件连接
一般的ESP8266都是6针脚,我个人的连接方式是:VCC接3.3v,GND接GND,RXD与TXD分别接USART3的TXD与RXD。另外两个引脚不需要管。
本次试验我所用的硬件:stm32f103zet6,esp8266,笔记本电脑,云服务器,家用的无线路由器(要能联网,还得开启DHCP)
第三部分:工程及程序描述
逻辑流程:先把ESP8266设置为STA Client透传模式,然后使用串口调试助手向USART1发送字符串,在USART1的接收中断内把字符串发送给USART3,再通过ESP8266经由无线路由器寻址云服务器,最终把字符串发送到云服务器。在云服务器端的SocketTool将收到字符串。
主要代码:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "usart3.h"
#include "common.h"
#include "StaConfig.h"
/************************************************
第一次测试完成日期:2020/2/7
第一次描述:通过USART3连接ESP8266的TX与RX。相关AT指令以及数据发送均通过USART3进行
主函数调用setClient设置为STAClient透传模式与阿里云服务器取得通信,通过在电脑上使用
串口助手发送字符串到串口1并在串口1中断服务函数内通过调用发送数据函数通过串口3发送给
ESP8266,然后再经由路由器发送到云服务器。云服务器端通过网络调试助手创建一个TCP SERVER
然后就可以向STM32发送数据了,接收到的数据由相应函数处理回显到串口调试助手内。
************************************************/
int main(void)
{
u8 ipbuf[50];
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
usart3_init(115200); //初始化串口3
setClient(ipbuf);
while(1)
{
atk_8266_at_response(1);
delay_ms(300);
}
}
#include "StaConfig.h"
#include "common.h"
/***********************************************************/
//第一次测试完工日期:2020/2/7
//作者:lht
/***********************************************************/
void setClient(u8 *ipbuf)//设置ESP8266工作在STA模式的CLIENT设置并开启透传
{
//printf("AT恢复出厂设置:%d\n",atk_8266_send_cmd("AT+RESTORE","OK",1000));
printf("AT测试:%d\n",atk_8266_send_cmd("AT","OK",500));
printf("设置为STA模式:%d\n",atk_8266_send_cmd("AT+CWMODE=1","OK",500));//设置为STA模式
printf("重启:%d\n",atk_8266_send_cmd("AT+RST","OK",500));//重启生效
delay_ms(1000); //延时3S等待重启成功
delay_ms(1000);
delay_ms(1000);
printf("连接到路由器:%d\n",atk_8266_send_cmd("AT+CWJAP=\"FAST666\",\"你的路由器密码\"","OK",1000));//连接路由器
printf("设置单链接:%d\n",atk_8266_send_cmd("AT+CIPMUX=0","OK",3500));
atk_8266_get_wanip(ipbuf);
printf("IP:%s\n",ipbuf);
//端口号不要带引号,否则会有意想不到的错误。
printf("连接到服务器:%d\n",atk_8266_send_cmd("AT+CIPSTART=\"TCP\",\"公网IP\",8080","OK",3000));//连接到SERVER
printf("开启透传模式:%d\n",atk_8266_send_cmd("AT+CIPMODE=1","OK",3500));//开启透传模式
printf("开始透传:%d\n",atk_8266_send_cmd("AT+CIPSEND","OK",550));//开始透
}
void setServer(u8 *ipbuf)//设置ESP8266工作在STA模式的SERVER设置
{
//printf("AT恢复出厂设置:%d\n",atk_8266_send_cmd("AT+RESTORE","OK",1000));
printf("AT测试:%d\n",atk_8266_send_cmd("AT","OK",500));
printf("设置为STA模式:%d\n",atk_8266_send_cmd("AT+CWMODE=1","OK",500));//设置为STA模式
printf("重启:%d\n",atk_8266_send_cmd("AT+RST","OK",500));//重启生效
delay_ms(1000); //延时3S等待重启成功
delay_ms(1000);
delay_ms(1000);
printf("连接到路由器:%d\n",atk_8266_send_cmd("AT+CWJAP=\"FAST666\",\"你的路由器密码\"","OK",1000));//连接路由器
printf("设置多链接:%d\n",atk_8266_send_cmd("AT+CIPMUX=1","OK",3500));
printf("开启服务器:%d\n",atk_8266_send_cmd("AT+CIPSERVER=1,8086","OK",2000));
atk_8266_get_wanip(ipbuf);
printf("IP:%s\n",ipbuf);
printf("开始传输:%d\n",atk_8266_send_cmd("AT+CIPSEND=3,25","OK",550));//开始透传
}
第四部分:测试
透传发送:使用串口调试助手向USART1发送字符串,在USART1的接收中断内把字符串发送给USART3,再通过ESP8266经由无线路由器寻址云服务器,最终把字符串发送到云服务器。在云服务器端的SocketTool将收到字符串
透传接收:服务器端发送字符串后ESP8266将收到的字符串发送给USART3,然后再把字符串打印到串口调试助手内显示
第五部分:问题警示
1.拿到ESP8266后我们通常都是先用AT指令测试下。当把ESP8266与板子连接好后不要误以为可以直接通过串口调试助手向ESP8266发送指令。除非直接连在串口1上。ESP8266返回的信息也是要在程序内接收中断函数的打印出来才会显示的,不是直接就能显示。即没有程序支持你的信息是显示不出来的
2.Sta Client模式下连接无线路由器的时候SSID与PASSWORD都是要带双引号的,并且编辑为一条字符串信息,而不是分成两条
3.连接服务器时端口号不要带双引号,否则要出问题。并且把协议类型,IP,端口编辑为一条字符串信息,协议类型与IP均用双引号。
4.当在自己电脑上用网络调试助手建立TCP Server供ESP8266连接时你的电脑不要用无线网,否则无法建立连接,如果是用SocketTool建立TCP Server能很清楚看到你的Server IP是0.0.0.0,毫无疑问肯定连不上.
5.防火墙拦截时把防火墙关了或者设置调试工具允许通过。
6.云端调试的准备工作见下面的博客:
阿里云服务器与个人电脑TCP通信的调试
7.官方的ESP8266文档并不是没有错误,只是整体不会有错,但一些细节可能有问题,建议多找几份权威文档对比看就能发现问题
然后按照上面我的试验步骤走就ok了。接下来我会在服务器端用JAVA编写web后台来进行数据收发并写入云端数据库(请见博客:https://blog.csdn.net/naruhina/article/details/104237504)
完整代码:https://download.csdn.net/download/naruhina/12146060