每日一言
把 “我不行” 换成 “我试试”,你会发现一片新的天地。
那关于优化
白盒测试
我们之前不是通过这个接线方式可以看到返回到信息嘛因为安信可的特性就是返回Esp8266的反馈,可以看到代码死在哪里了,导致连接不上,因为我们怎么知道5秒可以连接上路由器呢,所以说代码不太健壮,所以我们一定要让联网成功以后再让他去做数据透传这些事情
我们先通过这个测试来检测代码的好坏,那为什么要这样接线呢?
有两点
- 安可信助手是专门调试ESP8266的
因为原本ESP8266发送数据后都会发送这些成功和失败信息的信息的,但是一般的串口是不会返回信息的(只是不显示信息),由于安可信是做ESP8266的技术支持的,所以这个安可信串口助手会显示信息,那么我们就是可以利用这一点,来看我们的代码是否写得好,可以去不断调试,因为可以看到反馈信息
这个安可信的话会返回相关的信息 这个STCISP串口助手的话不会
那么我们可以先根据这一点先这样接线,目的就是调试代码,调试完之后我们再将单片机与ESP82664根线完全接通
展示代码
解释代码:
很简单,为什么我们要用这样的办法(标志位的方法),是因为延时是一个很容易炸的方法,我们可以去测试,每一次ESP8266联网的时间都不一样,那么就是很有可能会超过延时时间导致失败,或者导致时间的冗余,都是容易导致失败的原因,好的,现在我们根据标志位的方法
就等于是等待ESP8266进行连接WIFE、连接服务器、开启数据透传模式的操作,随后都会反馈数据,他只会一条一条执行,因为我们在中断的时候设置了。只有当我们在STCISP的串口助手输入带有W O这样的字眼才会跳出循环继续下去,为什么要这样做,取决于我们的接线测试,ESP8266的反馈在模拟阶段暂时要看得到的话必须要让安可信串口反馈现象,但是这个数据不会返回到单片机,如果不是测试的话,就会返回到单片机(测试测试,所以我们叫做测试!!!安可信的好处!!!)
当在安可信看到结果后说明ESP操作成功了,所以我们需要手动在STCISP(单片机的串口助手)发送WIFI GOT IP(相关字眼)发送后再发送OK 这个是对连WIFE的操作,当然我们的代码层面要讲OK这个标志复位为0,这样下面的指令才能用上OK的标志位
好啦,后面的都是我们看到安可信的成功信息后,我们STCISP那边就输入OK,就好了,就除了连WIFE我们是多设置了一个标志位要发送WIFE GOT IP 和OK,其他的都只要发送OK就行,
这样的成功率接近100%了,也就是一个成功的程序了,稳定性高
好了,测试完代码没有问题那我们就直接用单片机4根线直接连ESP8266,这样就不用我单片机还要输入信息才能开启下一条指令的发送了。复习一下原理:因为ESP8266会返回成功的信息,这样单片机收到后就会进行接收中断的判断,只要返回到字符数组里面有复合成功信息的相关的几个字符,那么我们就等于是判断出来了ESP8266成功的完成了联网等等相关操作
然后我们就可以通过TCP服务器来操控LED灯的亮灭了
比如说我们代码里面设置成这样我们就可以让LED灯灭
如果运用于手机上我们是不是就可以只要在一个局域网里面,我们就可以进行手机开关灯的操作了,惊喜吧!!!
其实我们已经可以完成很多了,如果你单片机的模块都堆上去,那我们是不是只要在家在一个局域网内都就可以通过手机对只要连接了ESP8266模块的模块进行操作了,那么是不是智能家居我们就可以去逐步实现了!!
最后一点优化点,要是出现了FALL现象,这个是小概率事件,但是我们要处理好他
我们在代码里面添加这个操作,我们这样可以根据灯的提示来判断,是否连接上了,如果没有连接上呢就会ESP8266给单片机返回FALL这个信息,那么我们设置了LED每个一秒亮一次,一共亮5次,后重启AT+RET是重启
完整的代码
#include "reg52.h"
#include "intrins.h"
#include <string.h>
sbit D5 = P3^7;
sbit D6 = P3^6;
sfr AUXR = 0x8E;
#define SIZE 12
char buffer[SIZE];
code char LJWL[] = "AT+CWJAP=\"RedmiK50Pro\",\"12345678\"\r\n";
code char LJFWQ[]= "AT+CIPSTART=\"TCP\",\"192.168.167.197\",8880\r\n";
char TCMS[] = "AT+CIPMODE=1\r\n"; //Êý¾Ý·¢ËÍģʽΪÊý¾Ý͸´«Ä£Ê½
char SJCS[] = "AT+CIPSEND\r\n";
char RESET[] = "AT+RST\r\n";
char AT_OK_Flag = 0;
char AT_Connect_Net_Flag = 0;
void Uart1_Init(void) //9600bps@11.0592MHz
{
AUXR = 0x01;
SCON = 0x50;//ÅäÖô®¿Ú¹¤×÷·½Ê½1£¬RENʹÄܽÓÊÕ
TMOD &= 0xF0;//ÅäÖö¨Ê±Æ÷ģʽΪ¶¨Ê±Æ÷1£¬8λ×Ô¶¯ÖØ×°ÔØ
TMOD |= 0x20;
TH1 = 0xFD;//É趨¶¨Ê±³õÖµ
TL1 = 0xFD;//ÉèÖö¨Ê±Æ÷֨װֵ
TR1 = 1; //Æô¶¯¶¨Ê±Æ÷
ES = 1;
EA = 1;
}
void sendByte(char data_msg){
SBUF = data_msg;
while(!TI);
TI=0;
}
void sendString(char *str){
while(*str!='\0'){
sendByte(*str);
str++;
}
}
void Delay1000ms(void) //@11.0592MHz
{
unsigned char data i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
int mark=0;
D5 = 1;
Uart1_Init();
Delay1000ms();
sendString(LJWL);
while(!AT_Connect_Net_Flag);
while(!AT_OK_Flag);
AT_OK_Flag = 0;
sendString(LJFWQ);
while(!AT_OK_Flag);
AT_OK_Flag = 0;
sendString(TCMS);
while(!AT_OK_Flag);
AT_OK_Flag = 0;
sendString(SJCS);
while(!AT_OK_Flag);
if(AT_Connect_Net_Flag){
D5 = 0;//´ú±íÈëÍø³É¹¦
}
if(AT_OK_Flag){
D6 = 0;//´ú±íÁ´½Ó·þÎñÆ÷²¢´ò¿ªÍ¸´«Ä£Ê½³É¹¦
}
while(1){
Delay1000ms();
sendString("helloworld\r\n");
}
}
void UART_handler() interrupt 4
{
static int i = 0;
int w;
char tmp;
if(RI == 1){
RI = 0;
tmp = SBUF;
if(tmp =='W' || tmp =='O' || tmp=='L' ||tmp=='F' ){
i = 0;
}
buffer[i++]=tmp;
if(buffer[0]=='W' && buffer[5]=='G'){
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]=='F' && buffer[1]=='A'){
for(w=0;w<5;w++){
D5 = 0;
Delay1000ms();
D5 = 1;
Delay1000ms();
}
sendString(RESET);
}
if(buffer[0]=='L' && buffer[2]=='1'){
D5 = 0;
}
if(buffer[0]=='L' && buffer[2]=='0'){
D5 = 1;
memset(buffer,'\0',SIZE);
}
if(i==12){
i=0;
memset(buffer,'\0',SIZE);
}
}
if(TI);
}