基于STM32F103的wifi数据透传
ESP8266串口型WIFI,主要用于传开关量、温度等
连线:
VCC ----3.3V
RST ----PE6 低电平复位
CH_PD ----PG7 使能脚,高电平正常工作
UTXD ----USART2 RX
URXD ----USART2 TX
GND ----GND
此次试验选STA模式的TCP Client透传,让WIFI模块连接路由器,然后在网络调试助手上设置好连接的IP地址和端口
STA模式,8266为客户端,PC是服务端
USART2发送的数据经过8266传输到网络调试助手上显示
8266默认波特率115200,8N1
所以USART2配置一样
修改WiFi名称、密码和IP
在下载程序前,修改sta_tcpclent_test.h
#define User_ESP8266_SSID "......" //要连接的热点的名称
#define User_ESP8266_PWD "......" //要连接的热点的密码
#define User_ESP8266_TCPServer_IP "......" //要连接的服务
器的IP,也就是电脑
#define User_ESP8266_TCPServer_PORT "......" //要连接的服务器的
端口
程序使用例程,注意一下几个函数就好
下面的函数,放入main.c的while(1)中
void ESP8266_STA_TCPClient_Test(void)
{
u8 res;
char str[100]={0};
printf ( "\r\n正在配置ESP8266请耐心等待...\r\n" );
ESP8266_CH_PD_Pin_SetH;//PG7 = 1
ESP8266_AT_Test();
ESP8266_Net_Mode_Choose(STA);
while(!ESP8266_JoinAP(User_ESP8266_SSID, User_ESP8266_PWD));//连接外部wifi
ESP8266_Enable_MultipleId ( DISABLE );
while(!ESP8266_Link_Server(enumTCP, User_ESP8266_TCPServer_IP, User_ESP8266_TCPServer_PORT, Single_ID_0));
//开启服务器和端口
while(!ESP8266_UnvarnishSend());
printf ( "\r\n配置ESP8266 OK!\r\n" );
while ( 1 )
{
sprintf (str,"GET IT!\r\n" );//这是发到PC的数据
ESP8266_SendString ( ENABLE, str, 0, Single_ID_0 );//发送给PC,在PC上显示
delay_ms(1000);
if(TcpClosedFlag) //检测是否失去连接
{
ESP8266_ExitUnvarnishSend(); //退出透传模式
do
{
res = ESP8266_Get_LinkStatus(); //获取连接状态
}
while(!res);
if(res == 4) //确认失去连接后重连
{
printf ( "\r\n请稍等,正在重连热点和服务器...\r\n" );
while (!ESP8266_JoinAP(User_ESP8266_SSID, User_ESP8266_PWD ) );
while (!ESP8266_Link_Server(enumTCP, User_ESP8266_TCPServer_IP, User_ESP8266_TCPServer_PORT, Single_ID_0 ) );
printf ( "\r\n重连热点和服务器成功\r\n" );
}
while(!ESP8266_UnvarnishSend());
}
}
}
//对ESP8266模块发送AT指令,重要函数
// cmd:待发送的指令
// ack1,ack2:期待的响应,为NULL表不需响应,两者为或逻辑关系
// time:等待响应的时间
//返回1:发送成功 0:失败
//if(ESP8266_Send_AT_Cmd("AT","OK",NULL,500))
bool ESP8266_Send_AT_Cmd(char *cmd,char *ack1,char *ack2,u32 time)
{
ESP8266_Fram_Record_Struct .InfBit .FramLength = 0; //从新开始接收新的数据包
ESP8266_USART("%s\r\n", cmd);//发送AT
if(ack1==0&&ack2==0) //不需要接收数据
{
return true;
}
delay_ms(time); //延时time时间
ESP8266_Fram_Record_Struct.Data_RX_BUF[ESP8266_Fram_Record_Struct.InfBit.FramLength ] = '\0';
//增加一个结束符。结合USART2中断看
PC_USART("%s", ESP8266_Fram_Record_Struct .Data_RX_BUF);//利用USART1打印
if(ack1!=0&&ack2!=0)
{
return ( ( bool ) strstr ( ESP8266_Fram_Record_Struct .Data_RX_BUF, ack1 ) ||
( bool ) strstr ( ESP8266_Fram_Record_Struct .Data_RX_BUF, ack2 ) );
}
else if( ack1 != 0 )//strstr(s1,s2);检测s2是否为s1的一部分,是返回该位置,否则返回false,它强制转换为bool类型了
return ( ( bool ) strstr ( ESP8266_Fram_Record_Struct .Data_RX_BUF, ack1 ) );
else
return ( ( bool ) strstr ( ESP8266_Fram_Record_Struct .Data_RX_BUF, ack2 ) );
}
AT指令:8266和单片机的交流语言
参考:ESP8266AT指令集安信可
下载完程序后运行如下:
USART1打印到PC
USART2传到8266,8266传到PC的网络调试助手