// 初始化 WIFI的复位IO
void WiFi_ResetIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; // 定义一个设置 IO端口参数的结构体
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA , ENABLE); // 使能 PA端口的时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // 设置PA4
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 速率50MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出方式
GPIO_Init(GPIOA, &GPIO_InitStructure); // 通过设定的 GPIO_InitStruct结构体参数初始化 GPIOA
RESET_IO(1); // 复位IO拉高电平
}
定义宏函数 RESET_IO(x),x = 1表示set,x = 0表示reset
#define RESET_IO(x) GPIO_WriteBit(GPIOA, GPIO_Pin_4, (BitAction)x)
WIFI 发送设置指令
// cmd: 指令; timeout: 超时时间(100ms的倍数)
char WiFi_SendCmd(char *cmd, int timeout)
{
WiFi_RxCounter=0; // WIFI接收数据量变量清零
memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE); // 清空 WIFI接收缓冲区
WiFi_printf("%s\r\n",cmd); // 发送指令
while(timeout--) // 等待超时时间到 0
{
Delay_Ms(100); // 延时 100ms
if(strstr(WiFi_RX_BUF,"OK")) // 如果接收到 OK表示指令成功
break; // 主动跳出 while循环
u1_printf("%d ",timeout); // 串口输出现在超时时间
}
u1_printf("\r\n"); // 串口输出信息
if(timeout<=0)return 1; // 如果 timeout <= 0,说明超时时间到,没有收到 OK,返回 1
else return 0; // 反之,表示正确,说明收到 OK,通过 break主动跳出 while
}
WIFI 复位
// timeout: 超时时间(100ms的倍数)
char WiFi_Reset(int timeout)
{
RESET_IO(0); // 复位 IO拉低电平
Delay_Ms(500); // 延时 500ms
RESET_IO(1); // 复位 IO拉高电平
while(timeout--) // 等待超时时间到 0
{
Delay_Ms(100); // 延时 100ms
if(strstr(WiFi_RX_BUF,"ready")) // 如果接收到 ready表示复位成功
break; // 主动跳出 while循环
u1_printf("%d ",timeout); // 串口输出现在的超时时间
}
u1_printf("\r\n"); // 串口输出信息
if(timeout<=0) return 1; // 如果 timeout <= 0表示超时时间到,没有收到 ready返回 1
else return 0; // 反之表示正确,收到 ready返回 0
}
WIFI 加入路由器指令
// timeout: 超时时间(1s的倍数)
char WiFi_JoinAP(int timeout)
{
WiFi_RxCounter=0; // WIFI接收数据量变量清零
memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE); // 清空 WIFI接收缓冲区
WiFi_printf("AT+CWJAP=\"%s\",\"%s\"\r\n",SSID,PASS); // 发送指令
while(timeout--) // 等待超时时间到 0
{
Delay_Ms(1000); // 延时 1s
if(strstr(WiFi_RX_BUF,"WIFI GOT IP\r\n\r\nOK")) // 如果接收到 WIFI GOT IP表示成功
break; // 主动跳出 while循环
u1_printf("%d ",timeout); // 串口输出现在的超时时间
}
u1_printf("\r\n"); // 串口输出信息
if(timeout<=0)return 1; // 如果 timeout <= 0说明超时时间到也没有收到返回 1
return 0; // 正确返回 0
}
连接 TCP 服务器,并进入透传模式
// timeout: 超时时间(100ms的倍数)
char WiFi_Connect_Server(int timeout)
{
WiFi_RxCounter=0; // WIFI接收数据量变量清零
memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE); //清空 WIFI接收缓冲区
WiFi_printf("AT+CIPSTART=\"TCP\",\"%s\",%d\r\n",ServerIP,ServerPort); // 发送连接服务器指令
while(timeout--) // 等待超时与否
{
Delay_Ms(100); // 延时 100ms
if(strstr(WiFi_RX_BUF ,"CONNECT")) // 如果接收到 CONNECT表示连接成功
break; // 跳出 while循环
if(strstr(WiFi_RX_BUF ,"CLOSED")) // 如果接收到 CLOSED表示服务器未开启
return 1; // 服务器未开启返回 1
if(strstr(WiFi_RX_BUF ,"ALREADY CONNECTED")) // 如果接收到 ALREADY CONNECTED已经建立连接
return 2; // 已经建立连接返回 2
u1_printf("%d ",timeout); // 串口输出现在的超时时间
}
u1_printf("\r\n"); // 串口输出信息
if(timeout<=0)return 3; // 超时错误返回 3
else
{
u1_printf("连接服务器成功,准备进入透传\r\n"); // 串口显示信息
WiFi_RxCounter=0; // WIFI接收数据量变量清零
memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE); // 清空 WIFI接收缓冲区
WiFi_printf("AT+CIPSEND\r\n"); // 发送进入透传指令
while(timeout--) // 等待超时与否
{
Delay_Ms(100); // 延时 100ms
if(strstr(WiFi_RX_BUF,"\r\nOK\r\n\r\n>")) // 如果成立表示进入透传成功
break; // 跳出 while循环
u1_printf("%d ",timeout); // 串口输出现在的超时时间
}
if(timeout<=0)return 4; // 透传超时错误返回 4
}
return 0; // 成功返回 0
}
// timeout: 超时时间(1s的倍数)
char WiFi_Smartconfig(int timeout)
{
WiFi_RxCounter=0; // WIFI接收数据量变量清零
memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE); // 清空 WIFI接收缓冲区
while(timeout--) // 等待超时时间到 0
{
Delay_Ms(1000); // 延时 1s
if(strstr(WiFi_RX_BUF,"connected")) // 如果串口接收到 connected表示成功
break; // 跳出 while循环
u1_printf("%d ",timeout); 串口输出现在的超时时间
}
u1_printf("\r\n"); // 串口输出信息
if(timeout<=0)return 1; // 延时错误返回 1
return 0; // 正确返回 0
}
等待加入路由器
char WiFi_WaitAP(int timeout)
{
while(timeout--) // 等待超时时间到 0
{
Delay_Ms(1000); // 延时 1s
if(strstr(WiFi_RX_BUF,"WIFI GOT IP")) // 如果接收到 WIFI GOT IP表示成功
break; // 主动跳出 while循环
u1_printf("%d ",timeout); // 串口输出现在的超时时间
}
u1_printf("\r\n"); // 串口输出信息
if(timeout<=0)return 1; // 如果 timeout <= 0表示超时时间到没有收到返回 1
return 0; // 正确返回 0
}
WIFI 连接服务器
char WiFi_Connect_IoTServer(void)
{
u1_printf("准备复位模块\r\n"); // 串口提示数据
if(WiFi_Reset(50)){
u1_printf("复位失败,准备重启\r\n");
return 1;
}else u1_printf("复位成功\r\n");
u1_printf("准备设置STA模式\r\n");
if(WiFi_SendCmd("AT+CWMODE=1",50)){
u1_printf("设置STA模式失败,准备重启\r\n");
return 2;
}else u1_printf("设置STA模式成功\r\n");
if(wifi_mode==0){
u1_printf("准备取消自动连接\r\n");
if(WiFi_SendCmd("AT+CWAUTOCONN=0",50)){
u1_printf("取消自动连接失败,准备重启\r\n");
return 3;
}else u1_printf("取消自动连接成功\r\n");
u1_printf("准备连接路由器\r\n");
if(WiFi_JoinAP(30)){
u1_printf("连接路由器失败,准备重启\r\n");
return 4;
}else u1_printf("连接路由器成功\r\n");
}else{
if(KEY2_IN_STA==0){
u1_printf("准备设置自动连接\r\n");
if(WiFi_SendCmd("AT+CWAUTOCONN=1",50)){
u1_printf("设置自动连接失败,准备重启\r\n");
return 3;
}else u1_printf("设置自动连接成功\r\n");
u1_printf("准备开启Smartconfig\r\n");
if(WiFi_SendCmd("AT+CWSTARTSMART",50))
{
u1_printf("开启Smartconfig失败,准备重启\r\n");
return 4;
}else u1_printf("开启Smartconfig成功\r\n");
u1_printf("请使用APP软件传输密码\r\n");
if(WiFi_Smartconfig(60))
{
u1_printf("传输密码失败,准备重启\r\n");
return 5;
}else u1_printf("传输密码成功\r\n");
u1_printf("准备关闭Smartconfig\r\n");
if(WiFi_SendCmd("AT+CWSTOPSMART",50))
{
u1_printf("关闭Smartconfig失败,准备重启\r\n");
return 6;
}else u1_printf("关闭Smartconfig成功\r\n");
}else{
u1_printf("等待连接路由器\r\n");
if(WiFi_WaitAP(30)){
u1_printf("连接路由器失败,准备重启\r\n");
return 7;
}else u1_printf("连接路由器成功\r\n");
}
}
u1_printf("准备设置透传\r\n");
if(WiFi_SendCmd("AT+CIPMODE=1",50)){
u1_printf("设置透传失败,准备重启\r\n");
return 8;
}else u1_printf("设置透传成功\r\n");
u1_printf("准备关闭多路连接\r\n");
if(WiFi_SendCmd("AT+CIPMUX=0",50)){
u1_printf("关闭多路连接失败,准备重启\r\n");
return 9;
}else u1_printf("关闭多路连接成功\r\n");
u1_printf("准备连接服务器\r\n");
if(WiFi_Connect_Server(100)){
u1_printf("连接服务器失败,准备重启\r\n");
return 10;
}else u1_printf("连接服务器成功\r\n");
return 0;
}