最近RFID的课程设计所以就尝试了一下WIFI模块,最主要的功能不多废话,直接上代码,不妥你带水:
void WIFI_Init()
{
int i;
ESP8266_Set("AT"); //测试指令
ms_delay(2000);
ESP8266_Set("AT+CWMODE_CUR=1");//进入Station模式,该模式下WIFI模块作为Client接入路由器
ms_delay(2000);
ESP8266_Set("AT+CWLAP");
ms_delay(2000);
ESP8266_Set("AT+CWJAP_CUR=\"TP-LINK_E4DA\",\"lipengyu0721\"");//登陆家里的路由器 路由器名字+密码
ms_delay(20000);
flag=1;
ESP8266_Set("AT+CIFSR"); //查看WIFI模块获得IP地址,
ms_delay(2000);
for(i=0;i<15;i++) //LCD显示WIFI模块分配到的IP地址,这里说一句WIFI模块的应答中第25个字节才是IP地址的首地址
{
LcdWriteData(Recive_Cmd[i]);
}
flag=0;
if((Recive_Cmd[1]=='1')&&(Recive_Cmd[2]=='9')&&(Recive_Cmd[3]=='2'))
{
LcdWriteCom(0x40+0x80);
for(i=0;i<16;i++)
{
LcdWriteData(Disp[i]);
}
}
ESP8266_Set("AT+CIPMUX=1"); //多连接
ms_delay(2000);
ESP8266_Set("AT+CIPSERVER=1,8888"); //设置Client的TCP端口号
ms_delay(2000);
}
声明几点:
1.WIFI模块响应的数据是以+IPD开始的,可以作为判别,协议中包括一个字节的计算数据量位。
2.以上除了LCD的显示删去后可直接使用;
3.WIFI模块返回的IP地址中第25个字节为IP的首地址;可以如一下接受:
void Uart_Interrupt() interrupt 4
{
static uchar i=0;
if(RI==1)
{
ES = 0;
RI=0;
if(flag==1) //Accept IP address
{
i++;
if(i>24) //只接受25字节之后的IP地址
{
Recive_Cmd[t]=SBUF;
t++;
if(i>41)
{
flag=0;
}
}
}
这块代码可实现与改模块建立握手之后由WIFI向上位机发送数据:|
void ESP8266_Sent(uchar *puf) // 数组指针*puf指向字符串数组
{
ESP8266_Set("AT+CIPSEND=0,8"); //0,8一次发送8个字节量
while(*puf!='\0') //遇到空格跳出循环
{
Send_Uart(*puf); //向WIFI模块发送控制指令。
us_delay(5);
puf++;
}
us_delay(5);
Send_Uart('\n'); //换行
ms_delay(10);
}
注意0,8,那么会一次发送8个字节就会停止某一个数组访问并继续运算;
这个是串口发送数据的一些代码可直接使用不用再调试:
void Send_Uart(uchar value)
{
ES=0; //关闭串口中断
TI=0; //清发送完毕中断请求标志位
SBUF=value; //发送
while(TI==0); //等待发送完毕
TI=0; //清发送完毕中断请求标志位
ES=1; //允许串口中断
}
void ESP8266_Set(uchar *puf) // 数组指针*puf指向字符串数组
{
while(*puf!='\0') //遇到空格跳出循环
{
Send_Uart(*puf); //向WIFI模块发送控制指令。
us_delay(5);
puf++;
}
us_delay(5);
Send_Uart('\r');//回车
us_delay(5);
Send_Uart('\n'); //换行
ms_delay(1000);
}
void Character_Send(uchar *puf)
{
while(*puf!='\0') //遇到空格跳出循环
{
Send_Uart(*puf); //向WIFI模块发送控制指令。
us_delay(5);
puf++;
}
}
下面这个是TCP网络调试助手:
qq:1363658871,私聊我直接发包。
目前正在用AS写上位机;