将ESP工作为AP路由模式并当成服务器

将ESP8266模块通过usb转串口接入电脑

c 复制代码
AT+CWMODE=3	//1.配置成双模

AT+CIPMUX=1	//2.使能多链接

AT+CIPSERVER=1	//3.建立TCPServer

AT+CIPSEND=0,4	//4.发送4个字节在链接0通道上
>

AT+CIPCLOSE=0	//5.断开连接

通过wifi找到安信可的wifi信号并连接

连接后查看自己的ip地址变为192.168.4.2

说明此时已经与ESP连接成功,打开网络调试助手,选择TCP Client,输入本地主机地址,以及远程主机地址(端口默认为333)。

就像上篇博文一样采用白盒测试的方法,先进行调试,调试一切顺利后,黑盒测试,连接到单片机

代码如下:

c 复制代码
#include "reg52.h"
#include <intrins.h>
#include <string.h>

#define SIZE 12
sfr AUXR = 0x8E;
sbit D5 = P3^7;
sbit D6 = P3^6;

char buffer[SIZE];


char LYMS[] = "AT+CWMODE=2\r\n";	//1.工作在路由模式
char DLJ[] = "AT+CIPMUX=1\r\n";	//2.使能多链接
char JLFW[] = "AT+CIPSERVER=1\r\n";	//3.建立TCPServer,默认端口号333
char FSSJ[] = "AT+CIPSEND=0,5\r\n";	//4.发送4个字节在链接0通道上

char AT_Connect_Net_Flag = 0;
char AT_OK_Flag = 0;
char Client_Connect_Flag = 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 UartInit(void)		//9600bps@11.0592MHz
{
	SCON = 0x50;	//定义串口工作方式为方式1,8位UART
	//PCON初值为00x1 0000符合我们的要求,我们只需要SMOD=0不加倍即可
	AUXR = 0x01;
	TMOD &= 0x0F;
	TMOD |= 0x20;	//配置定时器1为8为自动重载定时器
	
	TL1 = 0xFD;
	TH1 = 0xFD;	//9600波特率初值
	
	TR1 = 1;	//打开中断
	
	EA = 1;	//开启总中断
	ES = 1;	//开启UART中断
}

void sendByte(char data_msg){
	SBUF = data_msg;
	//当8位数据没有传送结束时,卡在while循环中
	while(!TI);	//TI发送中断请求标志位,第8位数据传送结束时,硬件自动置1
	TI = 0;
}

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

void main()
{
	int mark = 0;
	D5 = D6 = 1;
	//配置C51串口的通信方式
	UartInit();
	Delay1000ms();	//给wifi模块上电时间
	
	sendString(LYMS);	//路由模式
	while(!AT_OK_Flag);
	AT_OK_Flag = 0;
	
	sendString(DLJ);	//多链接
	while(!AT_OK_Flag);
	AT_OK_Flag = 0;
	
	sendString(JLFW);	//建立TCP服务器
	//while(!AT_OK_Flag);
	while(!Client_Connect_Flag);
	AT_OK_Flag = 0;
	
	if(Client_Connect_Flag){
		//两盏灯同时亮 表示有客户端接入
		D5 = 0;
		D6 = 0;
	}

	
	while(1){
		sendString(FSSJ);
		Delay1000ms();
		Delay1000ms();
		sendString("Hello");
		Delay1000ms();
		Delay1000ms();
	}	
}

void Uart_Handler() interrupt 4
{
	static int i = 0;
	char tmp;
	if(RI){	//中断处理函数中,对于接收中断的响应
		RI = 0;
		tmp = SBUF;
		if(tmp == 'W' || tmp == 'O' || tmp == 'L' || tmp == '0' || tmp == ':'){
			i = 0;
		}
		buffer[i] = tmp;
		i++;
		
		if(buffer[0] == 'W' && buffer[5] == 'G'){	//当显示WIFI GOR IP时表示网络已经接入,修改标志位
			AT_Connect_Net_Flag = 1;
			memset(buffer,'\0',SIZE);
		}
		
		if(buffer[0] == 'O' && buffer[1] == 'K'){
			AT_OK_Flag = 1;
			memset(buffer,'\0',SIZE);
		}
		
		if(buffer[0] == '0' && buffer[2] == 'C'){
			Client_Connect_Flag = 1;
			memset(buffer,'\0',SIZE);
		}
		
		if(buffer[0] == ':' && buffer[1] == 'o' && buffer[2] == 'p'){
			D5 = 0;
			memset(buffer,'\0',SIZE);
		}
		if(buffer[0] == ':' && buffer[1] == 'c' && buffer[2] == 'l'){
			D5 = 1;
			memset(buffer,'\0',SIZE);
		}
		if(i == 12) i=0;
	}
	//if(TI);
}

会卡在服务器连入即while(!Client_Connect_Flag);需要我们找到wifi连入,并将网络调试助手连接后即可收到心跳包的数据,此时单片机的两盏灯点亮,我们可以通过open和close指令开关灯。

相关推荐
时差freebright2 小时前
【Linux系统】信号:再谈OS与内核区、信号捕捉、重入函数与 volatile
linux·运维·服务器
s_little_monster2 小时前
【Linux】进程状态和优先级
linux·服务器·数据库·经验分享·笔记·学习·学习方法
苹果醋34 小时前
机器学习算法在网络安全中的实践
java·运维·spring boot·mysql·nginx
9毫米的幻想4 小时前
【Linux系统】—— make/makefile
linux·运维·服务器
Web极客码5 小时前
预防和应对DDoS的方法
服务器·ddos·应用层
大耳朵土土垚5 小时前
【Linux】线程池封装与介绍
java·linux·运维
大丈夫立于天地间5 小时前
Linux 系统上安装 Docker 并进行配置
linux·运维·docker
阿正的梦工坊8 小时前
Unix 进程的启动方式及经典和现代做法(中英双语)
服务器·unix
阿正的梦工坊8 小时前
什么是 Shell?常见的 Unix Shell有哪些?(中英双语)
linux·服务器·unix
会飞的爱迪生13 小时前
mac连接linux服务器
linux·服务器·macos