自学内容网 自学内容网

10:WiFi模块服务器模式


我们通过AT指令AT+CWMODE = x,可以配置WiFi模块的工作模式。  

  • AT+CWMODE=1为移动设备模式,这时WiFi模块可以连接其他路由器WiFi,然后可以给连接这个WiFi的其他移动设备发送数据,也可以接收数据。
    条件:①要连接同一个WiFi;②要知道其他移动设备的ip地址和端口号(服务端);③移动设备要网络调试软件(TCP模式,且作为服务端),并且打开端口,这样WiFi模块(客户端)才能连接成功。
  • AT+CWMODE=2为服务器模式,这时WiFi模块作为一个服务端,模块不用连接WiFi,移动设备(客户端)要连接上模块发出WiFi和知道模块的IP地址和端口号,才能相互通信。
    条件:①移动设备要连接模块发出的WiFi,②移动设备要知道模块的ip地址和端口号。

总结:1、要知道服务端的IP地址和端口号
    2、通过TCP协议传输的

1、单片机通过WiFi模块向移动设备进行通信

操作步骤:1、先给模块供电,然后让客服端连接WiFi。
2、单片机给模块发送AT指令进行配置(AT+RST–>AT+CWMODE=2–>AT+CIPMUX=1–>AT+CIPSERVER=1)
3、我们通过指令AT+CIFSR知道了模块的IP为192.168.4.1,默认端口为333
4、然后客户端配置本机的IP,输入模块的ip和端口,进行连接。连接成功,客户端就可以给模块发送数据了
5、要想模块给客户端发送数据,则需要指令AT+CIPSEND=0,x
6、模块接收的数据格栅为:
+IPD,0,4:open
+IPD,0,5:close

#include <REGX52.H>
#include "intrins.h"
#include <string.h>

/*
发送:AT+RST//重启
返回:ready
发送:AT+CIPMUX=1//使能多连接
返回:OK
发送:AT+CIPSERVER=1//配置为TCP
返回:OK
连接到模块ip返回:0,CONNECT
*/


sfr AUXR = 0X8E;
sbit LED1 = P3^7;
sbit LED2 = P3^6;

char buffer[3];//定义2个字节的字符串数组,用来接收WiFi模块响应后,返回的字符串。
char dma_fs[] = "abcd\r\n";

code char CQWF[] = "AT+RST\r\n";//wifi模块重启
//code char PZMS[] = "AT+CWMODE=2\r\n";//工作模式
code char DLJ[] = "AT+CIPMUX=1\r\n";//使能多连接
char JLTCP[] = "AT+CIPSERVER=1\r\n";//建立TCP,先at,后连接
char FSSJ[] = "AT+CIPSEND=0,4\r\n";//开始发送

char Flag_OK = 0;
char Flag_TCP = 0;

void Delay1000ms()//@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}

void Delay300ms()//@11.0592MHz
{
unsigned char i, j, k;

_nop_();
i = 3;
j = 26;
k = 223;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}

void UartInit(void)//波特率9600
{
PCON &= 0x7F;//波特率不倍速
SCON = 0x50;//8位数据,可变波特率
AUXR = 0x01;
TMOD &= 0x0F;//清除定时器1模式位
TMOD |= 0x20;//设定定时器1为8位自动重装方式
TL1 = 0xFD;//设定定时初值
TH1 = 0xFD;//设定定时器重装值
ET1 = 0;//禁止定时器1中断
TR1 = 1;//启动定时器1

ES = 1;//开启串口中断
EA = 1;//开启中断总开关
}



void sendByte(char data_sj)
{
SBUF = data_sj;
while(!TI);
TI = 0;
}

void sendString(char *str)
{
while(*str != '\0')
{
sendByte(*str);
str++;
}
}

void main()
{
LED1 = LED2 = 1;
UartInit();
  Delay300ms();

sendString(CQWF);
    Delay1000ms();
//  sendString(PZMS);
//  Delay1000ms();
//1、配置多连接
sendString(DLJ);
  while(!Flag_OK)//如果没有配置成功LED1会闪烁
  {
LED1 = 0;
  Delay1000ms();
  LED1 = 1;
  Delay1000ms();
  }
 Flag_OK = 0;      
 LED1 = 0;  //使能多连接成功后,LED1亮
Delay300ms();
//2、配置为TCP
sendString(JLTCP);
while(!Flag_OK);
  while(!Flag_TCP)//等待客户机连接到模块的IP,如果客户端没有连接到模块,则LED2会闪烁
{
 LED2 = 1; 
 Delay1000ms();
 LED2 = 0;
 Delay1000ms();
}    
 Flag_TCP = 0;
 LED2 = 1;
   Delay1000ms();
   LED2 = 0;   //如果客户端连接到模块,则LED2会被点亮
while(1)
{
Delay300ms();
sendString(FSSJ);
Delay1000ms();
Delay1000ms();
sendString(dma_fs);
Delay1000ms();
Delay1000ms();
}
}

void UART_Handler() interrupt 4
{
char temp;
static int i = 0;
if(RI)
{
RI = 0;
temp = SBUF;
if(temp == '0'||temp == 'O'|| temp == 'o'|| temp == 'c')
{
i = 0;
}
buffer[i] = temp;
i++;
if(i == 3)
i = 0;
if(buffer[0] == '0' && buffer[2] == 'C')//接收到的字符串为0,CONNECT,把0,C抓出来
{
Flag_TCP = 1;
memset(buffer,'\0',3);
}

if(buffer[0] == 'O' && buffer[1] == 'K')//接收到的字符串为OK
{
Flag_OK = 1;
memset(buffer,'\0',3);
}

if(buffer[0] == 'o' && buffer[1] == 'p')//输出open
{
LED1 = 0;
memset(buffer,'\0',3);
}
if(buffer[0] == 'c' && buffer[1] == 'l')//输入close
{
LED1 = 1;
memset(buffer,'\0',3);
}
}
}

在这里插入图片描述


原文地址:https://blog.csdn.net/qq_51284092/article/details/140711876

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!