前言
Esp8266算是一个傻瓜式的wifi通信模块,前前后后也用过好几次,这次隔了好久没用有些东西都忘了,所在这里记录一下,防止以后用的时候又忘了。
硬件电路连接
话不多说,先上电路连接图。本次使用的是ESP-01S,也适用于ESP-01。下面是使用手册的连接图:
但实际上使用时,一般将此模块的EN和VCC接口都接上5V的电压上,能保证通信的稳定,不过有一个问题就是容易发热,此时可以参考使用手册上给EN和5V电压之间加上一个小电阻。
初始化ESP为TCP客户端
本次我们使用esp8266作为TCP通信的客户端,在局域网中连接主服务器,并实现通信。具体初始化步骤如下:
- AT+CWMODE=1 //配置为station模式
- AT+CWJAP_DEF=“热点名”,“密码” //连接局域网热点
- AT+CIPMUX=0 //开启单连接
- AT+CIPSTART=“TCP”,“服务器IP地址”,端口号 //连接TCP服务器
- AT+CIPMODE=1 //开启透传模式
- AT+CIPSEND //开始发送
至此,esp8266作为客户端就配置完成,具体的stm32初始化代码如下:
_Bool ResetWifi = False; //判断是否需要更改默认wifi连接
void ESP8266_Init(void)
{
u8 i ;
u8 at_rst[] = "AT+RST\x0D\x0A"; //重启esp
u8 at_cwmode[] = "AT+CWMODE=1\0x0D\0x0A"; //配置为Station模式
u8 at_cwjap[] = "AT+CWJAP_DEF=\"Mi20\",\"12345678\"\x0D\x0A"; //连接wifi 参数:热点名字+密码
u8 at_cipmux[] = "AT+CIPMUX=0\x0D\x0A"; //设置单主机模式 参数:0
u8 at_cipstart[] = "AT+CIPSTART=\"TCP\",\"192.168.43.1\",8080\x0D\x0A"; //连接到服务器 参数:ip地址+端口号
u8 at_cipmode[] = "AT+CIPMODE=1\x0D\x0A"; //透传模式 参数:1
u8 at_cipsend[] = "AT+CIPSEND\x0D\x0A";
for(i = 0; at_rst[i]!='\0'; i++){
USART2->DR = at_rst[i];//送出AT+RST(回车)
while((USART2->SR & 0x40) == 0);//直到发送成功
}
delay_ms(3000);
if(ResetWifi){ //重置wifi无线连接
for(i = 0; at_cwmode[i]!='\0'; i++){
USART2->DR = at_cwmode[i];//送出AT+CWMODE=1(回车)
while((USART2->SR & 0x40) == 0);//直到发送成功
}
delay_ms(2000);
for(i = 0; at_cwjap[i]!='\0'; i++){
USART2->DR = at_cwjap[i];//送出AT+CWJAP_DEF="Redmi","87654321"
while((USART2->SR & 0x40) == 0);//直到发送成功
}
delay_ms(10000);
for(i = 0; at_cipmux[i]!='\0'; i++){
USART2->DR = at_cipmux[i];//AT+CIPMUX=0
while((USART2->SR & 0x40) == 0);//直到发送成功
}
delay_ms(2000);
}
for(i = 0; at_cipstart[i]!='\0'; i++){
USART2->DR =at_cipstart[i];//AT+CIPSTART="TCP","192.168.43.33",8080(回车)
while((USART2->SR & 0x40) == 0);//直到发送成功
}
delay_ms(2000);
for(i = 0; at_cipmode[i]!='\0'; i++){
USART2->DR = at_cipmode[i];//AT+CIPMODE=1
while((USART2->SR & 0x40) == 0);//直到发送成功
}
delay_ms(800);
for(i = 0; at_cipsend[i]!='\0'; i++){
USART2->DR = at_cipsend[i];//AT+CIPSEND 开启透传
while((USART2->SR & 0x40) == 0);//直到发送成功
}
delay_ms(800);
UART_send_string("wifi connected! \n", USART2);
IS_unvantra = 1; //开启透传
}
记遇到的一些问题
- esp8266要与开发板共地,否则可能会导致初始化失败
- 每次发送一条指令后使用delay_ms()来给定初始化反应的时间
- 使用AT+CWJAP_DEF不能正确的连接到本地热点,同样的功能可以用串口通信实现,原因未知?