“掌握esp8266使用可实现真正的万物互联”
掌握RS232通信协议 SPI通信协议 esp8266的配置就可以基本搞定WiFi模块的使用
RS232通信协议
广泛用于DCE(Data Communication Equipment)和DTE(Data Terminal Equipment)之间的连接 DCE数据通信端 DTE终端
接口形态
以九针RS232接口为主流接口形态 公头(Male): 母座(Female):
接口定义
公头九针RS232接口详细定义 DTR/DSR 和RTS/CTS用于硬件流控 DTR/DSR表明DTE DCE可用 开始数据传输 需要RTS/CTS流控信号 如A发送数据给B 1.A设置RTS为1 表示要发送数据给B 2.B检测到RTS为1 若已准备好设置CTS为1表示可以接收 若没有准备好 先处理数据 完毕后再设置CTS为1 3.A发现CTS置1 将数据通过TXD信号线发送出去 4.A每发送一次数据 重复上面的步骤 5.A发送完数据后将RTS置1 表示数据发送完毕
硬件连接
9线连接 5线式连接:
3线式连接: 3线连接不能实现流控功能 在大量数据传输应用中 建议使用5线 9线连接方式
电平时序
负逻辑电平 RS232接口按照UART串口协议进行传输
ESP8266配置
ESP8266
超低功耗 USRT—WiFi透传模块 可将物理设备连接到WIFI无线网络上进行互联网或局域网通信 实现联网
引脚
原理
特点
支持STA/AP/STA+AP三种工作模式 内置TCP/IP 协议栈 支持多路TCP Client连接 支持UART/GPIO数据通信接口 支持Smart Link智能联网功能 内置32位MCU 可兼作应用处理器 3.3V单电源供电 支持Socket AT指令
AT指令
进行系统参数配置的指令
AT+<COMMAND>=<VALUE>\r\n
ATK-ESP8266支持的指令列
工作模式
STA模式
串口无线 STA(COM-STA)模式,模块作为无线 WIFI STA,用于连接到无线网络,实 现串口与其他设备之间的无线(WIFI)数据转换互传。
串口无线 STA 模式,TCP 服务器配置 串口无线 STA 模式,TCP 客户端配置
串口无线 STA 模式,UDP 配置
AP模式
串口无线 WIFI(COM-AP)模式,模块作为无线 WIFI 热点,允许其他 WIFI 设备连接 到本模块,实现串口与其他设备之间的无线(WIFI)数据转换互传。
串口无线 WIFI AP 模式,TCP 服务器配置 串口无线 WIFI AP 模式,TCP 客户端配置 串口无线 WIFI AP 模式,UDP 配置
STA+AP模式
串口无线 AP+STA(COM-AP+STA)模式,模块既作无线 WIFI AP,又作无线 STA, 其他 WIFI 设备可以连接到该模块,模块也可以连接到其他无线网络,实现串口与其他设备 之间的无线(WIFI)数据转换互传。
串口无线 AP+STA 模式,AP 作 TCP 服务器,STA 做 TCP 服务器的配置 串口无线 AP+STA 模式,AP 作 TCP 服务器,STA 作 TCP 客户端的配置 串口无线 AP+STA 模式,AP 作 TCP 服务器,STA 作 UDP 的配置
硬件连接
探索者F407只需要用跳线帽短接P10的USART3_RX和GBC_TX以及USART3_TX 和 GBC_RX 即可。
代码
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;
}
u8 atk_8266_quit_trans(void)
{
while((USART3->SR&0X40)==0);
USART3->DR='+';
delay_ms(15);
while((USART3->SR&0X40)==0);
USART3->DR='+';
delay_ms(15);
while((USART3->SR&0X40)==0);
USART3->DR='+';
delay_ms(500);
return atk_8266_send_cmd("AT","OK",20);
}
三个查询函数
u8 atk_8266_consta_check(void)
{
u8 *p;
u8 res;
if(atk_8266_quit_trans())return 0;
atk_8266_send_cmd("AT+CIPSTATUS",":",50);
p=atk_8266_check_cmd("+CIPSTATUS:");
res=*p;
return res;
}
void atk_8266_get_wanip(u8* ipbuf)
{
u8 *p,*p1;
if(atk_8266_send_cmd("AT+CIFSR","OK",50))
{
ipbuf[0]=0;
return;
}
p=atk_8266_check_cmd("\"");
p1=(u8*)strstr((const char*)(p+1),"\"");
*p1=0;
sprintf((char*)ipbuf,"%s",p+1);
}
void atk_8266_get_ip(u8 x,u8 y)
{
u8 *p;
u8 *p1;
u8 *p2;
u8 *ipbuf;
u8 *buf;
p=mymalloc(SRAMIN,32);
p1=mymalloc(SRAMIN,32);
p2=mymalloc(SRAMIN,32);
ipbuf=mymalloc(SRAMIN,32);
buf=mymalloc(SRAMIN,32);
if(atk_8266_send_cmd("AT+CIFSR","OK",50))
{
*ipbuf=0;
}
else
{
p=atk_8266_check_cmd("APIP,\"");
p1=(u8*)strstr((const char*)(p+6),"\"");
p2=p1;
*p1=0;
ipbuf=p+6;
sprintf((char*)buf,"AP IP:%s 端口:%s",ipbuf,(u8*)portnum);
Show_Str(x,y,200,12,buf,12,0);
p=(u8*)strstr((const char*)(p2+1),"STAIP,\"");
p1=(u8*)strstr((const char*)(p+7),"\"");
*p1=0;
ipbuf=p+7;
sprintf((char*)buf,"STA IP:%s 端口:%s",ipbuf,(u8*)portnum);
Show_Str(x,y+15,200,12,buf,12,0);
myfree(SRAMIN,p);
myfree(SRAMIN,p1);
myfree(SRAMIN,p2);
myfree(SRAMIN,ipbuf);
myfree(SRAMIN,buf);
}
}
测试主函数
void atk_8266_test(void)
{
u8 key;
u8 timex;
POINT_COLOR=RED;
Show_Str_Mid(0,30,"ATK-ESP8266 WIFI 模块测试",16,240);
while(atk_8266_send_cmd("AT","OK",20))
{
atk_8266_quit_trans();
atk_8266_send_cmd("AT+CIPMODE=0","OK",200);
Show_Str(40,55,200,16,"未检测到模块!!!",16,0);
delay_ms(800);
LCD_Fill(40,55,200,55+16,WHITE);
Show_Str(40,55,200,16,"尝试连接模块...",16,0);
}
while(atk_8266_send_cmd("ATE0","OK",20));
atk_8266_mtest_ui(32,30);
while(1)
{
delay_ms(10);
atk_8266_at_response(1);
key=KEY_Scan(0);
if(key)
{
LCD_Clear(WHITE);
POINT_COLOR=RED;
switch(key)
{
case 1:
Show_Str_Mid(0,30,"ATK-ESP WIFI-AP+STA 测试",16,240);
Show_Str_Mid(0,50,"正在配置 ATK-ESP8266 模块,请稍
等...",12,240);
atk_8266_apsta_test();
break;
case 2:
Show_Str_Mid(0,30,"ATK-ESP WIFI-STA 测试",16,240);
Show_Str_Mid(0,50,"正在配置 ATK-ESP8266 模块,请稍
等...",12,240);
atk_8266_wifista_test();
break;
case 4:
atk_8266_wifiap_test();
break;
}
atk_8266_mtest_ui(32,30);
timex=0;
}
if((timex%20)==0)LED0=!LED0;
timex++;
}
}
|