本篇博文介绍的是用51单片机的串口通信的应用(ESP8266 WIFI 模块),包含优化8266使用,监测AT执行结果,优化8266,捕获联网失败的状态,ESP8266工作位AP路由模式并当成服务器,51单片机当路由器和服务器模式控制。看到这篇博文的朋友,可以先赞再看吗?
一、基本电路标识识别和接线,例如VCC,GND。
二、C变量
三、基本输入输出
四、流程控制
五、函数
六、指针
七,字符串
如果以上知识不清楚,请自行学习后再来浏览。如果我有没例出的,请在评论区写一下。谢谢啦!
while
循环等待ESP8266
发送乱码while
循环等待char con_Net_Flag = 0; //定义联网等待标志
char at_OK_Flag = 0; //定义指令执行成功等待标志
//发送联网指令
sendString(cNetwork);
//等待联网成功
while(!con_Net_Flag);
while(!at_OK_Flag);
at_OK_Flag =0; //回归初识状态方便下次使用。
//发送连接服务器指令
sendString(cServer);
//等待连接服务器成功
while(!at_OK_Flag);
at_OK_Flag =0;
//发送打开透传模式指令
sendString(oTransparent);
//等待打开透传模式
while(!at_OK_Flag);
at_OK_Flag =0;
//发送打开实时发送指令
sendString(rTimeT);
//等待打开实时发送
while(!at_OK_Flag);
当我们成功发送联网指令并让ESP8266
模块联网,ESP8266
会返回WIFI GOT IP
。那么就可以通过判断返回的指令中第一个字符
和第六个字符
是否是‘W’
和‘G’
。若果是就可以让等待标志置1
,使单片机不再等待,并清空
承接字符串的缓冲器buffer
。但如果返回的字符串是WIFI GOT IP
但第一个
和第六个
字符并不是‘W’
和‘G’
,我们可以定义一个过渡变量tmp
来判断,让tmp
承接SBUF
串回来的字符,并对其做判断,如果tmp
等于第一个字符,就让历循字符数组的变量i
强制等于1
。(注:对于连接服务器,打开透传,打开实时发送,打开灯的一系列操作也用此算法思路实现
)
tmp = SBUF;
if(tmp=='W' || tmp=='O' || tmp=='L')
{
i = 0;
}
buffer[i++] = tmp;
if(buffer[0]=='W' && buffer[5]=='G')
{
con_Net_Flag = 1;
memset(buffer,'\0',SIZE);
}
if(buffer[0]=='O' && buffer[1]=='K')
{
at_OK_Flag = 1;
memset(buffer,'\0',SIZE);
}
//如果用L-1指令开灯,L-0指令关灯
if(buffer[0]=='L' && buffer[2]=='1')
{
LED1 = 0;
memset(buffer,'\0',SIZE);
}
if(buffer[0]=='L' && buffer[2]=='0')
{
LED1 = 1;
memset(buffer,'\0',SIZE);
}
if(i == SIZE)
{
i = 0;
}
ESP8266
发送乱码//初始化串口,配置波特率
UartInit();
//休眠1秒,让ESP8266发送乱码
Delay1000ms();
LED1
为联网成功指示灯,LED2
为联网和打开透传模式成功指示灯。sbit LED1 = P3^7; //使用位定义声明LED1
sbit LED2 = P3^6; //使用位定义声明LED2
if(con_Net_Flag)
{
LED1 = 0; //联网成功LED1亮
}
if(at_OK_Flag)
{
LED2 = 0; //联网和打开透传模式成功LED2亮
}
#include "reg52.h"
#include "string.h"
#include "intrins.h"
#define SIZE 32
sfr AUXR = 0x8e; //声明AUXR寄存器地址
sbit LED1 = P3^7; //使用位定义声明LED1
sbit LED2 = P3^6; //使用位定义声明LED2
char buffer[SIZE]; //接收返回指令标志
code char cNetwork[] = "AT+CWJAP=\"a\",\"123456789\"\r\n"; //连接网络指令,\"为转译功能,code的功能是单独存放大数据
code char cServer[] = "AT+CIPSTART=\"TCP\",\"192.168.253.12\",5000\r\n"; //连接服务器
char oTransparent[] = "AT+CIPMODE=1\r\n"; //打开透传
char rTimeT[] = "AT+CIPSEND\r\n"; //打开实时发送
char con_Net_Flag = 0; //定义联网等待标志
char at_OK_Flag = 0; //定义指令执行成功等待标志
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void UartInit(void) //自己配
{
//配置串口工作方式为方式1,从只收不发改为能收能发
SCON = 0x50;
//配置辅助寄存器,减少电磁辐射,稳定晶振频率
AUXR = 0x01;
//设置定时器工作方式为定时器1的8位自动重装
TMOD &= 0x0F;
TMOD |= 0x20;
//设置串口波特率为9600,0误差
TH1 = 0xFD;
TL1 = 0xFD;
//打开定时器1
TR1 = 1;
//打开总中断
EA = 1;
//打开串口中断
ES = 1;
}
void sendByte(char data_mas)
{
SBUF = data_mas;
while(!TI);
TI = 0; //一定要软件置零,不然会出现乱序
}
void sendString(char *str)
{
while(*str != '\0')
{
sendByte(*str);
str++;
}
}
void main()
{
//初始化串口,配置波特率
UartInit();
//休眠1秒,让ESP8266发送乱码
Delay1000ms();
//初始化状态灯,使熄灭。
LED1 = 1;
LED2 = 1;
//发送联网指令
sendString(cNetwork);
//等待联网成功
while(!con_Net_Flag);
while(!at_OK_Flag);
at_OK_Flag =0; //回归初识状态方便下次使用。
//发送连接服务器指令
sendString(cServer);
//等待连接服务器成功
while(!at_OK_Flag);
at_OK_Flag =0;
//发送打开透传模式指令
sendString(oTransparent);
//等待打开透传模式
while(!at_OK_Flag);
at_OK_Flag =0;
//发送打开实时发送指令
sendString(rTimeT);
//等待打开实时发送
while(!at_OK_Flag);
if(con_Net_Flag)
{
LED1 = 0; //联网成功LED1亮
}
if(at_OK_Flag)
{
LED2 = 0; //联网和打开透传模式成功LED2亮
}
//每延时1秒向电脑发送数据a
/*Delay1000ms();
sendString("一起来学串口通信!!!\r\n"); //\r\n 为串口中的换行,缺一不可
//怎么知道PC发了数据:由手册可知RI位为接受中断标志位,所以用查询的方法来判断RI是否等于1来开关灯*/
while(1)
{
sendString("网络配置完毕!\r\n");
Delay1000ms();
}
}
void UART_handler() interrupt 4
{
//定义临时变量tmp用于判断接收的字符是否是需要的首字符。
char tmp;
//定义一个静态整型变量,在多次函数调用中只被执行一次初始化
static int i = 0;
//在串口中段函数中可以对发送接收中断标志进行处理
if(RI == 1)
{
RI = 0; //必须软件置零
tmp = SBUF;
if(tmp=='W' || tmp=='O' || tmp=='L')
{
i = 0;
}
buffer[i++] = tmp;
if(buffer[0]=='W' && buffer[5]=='G')
{
con_Net_Flag = 1;
memset(buffer,'\0',SIZE);
}
if(buffer[0]=='O' && buffer[1]=='K')
{
at_OK_Flag = 1;
memset(buffer,'\0',SIZE);
}
//如果用1指令开灯,0指令关灯
if(buffer[0]=='L' && buffer[2]=='1')
{
LED1 = 0;
memset(buffer,'\0',SIZE);
}
if(buffer[0]=='L' && buffer[2]=='0')
{
LED1 = 1;
memset(buffer,'\0',SIZE);
}
if(i == SIZE)
{
i = 0;
}
}
if(TI);
}
白盒接线请看上篇
调试思路
分别打开单片机下载器的串口助手
,PC网络调试助手配置服务器
,ESP8266调试助手
。启动单片机,当看到ESP8266调试助手显示WIFI GOT IP
时通过单片机下载器的串口助手发送WIFI GOT IP
,当看到ESP8266调试助手显示OK
时通过单片机下载器的串口助手发送OK
。直到看见PC网络调试助手接收区显示“网络配置成功!”
字样即调试完毕。
请私信我。
ESP8266
没有联网标志FAILWIFI GOT IP
bugif(tmp=='W' || tmp=='O' || tmp=='L' || tmp=='F')
{
i = 0;
}
if(buffer[0]=='F' && buffer[1] == 'A')
{
statusLED1();
sendString(RESET);
Delay1000ms();
sendString(cNetwork);
memset(buffer,'\0',SIZE);
}
WIFI GOT IP
bugWIFI GOT IP
bug的现象 当在串口中断函数中加入检测ESP8266联网失败标志FAIL代码时,如果能够正常联网,则会卡主不执行。用白盒调试,会发现在连接好网络后,通过单片机下载器串口助手发送卡WIFI GOT IP
然后再发送OK
都不会继续执行发送连接服务器指令和后续指令。while(!con_Net_Flag);
是个延时bug。我在这里尝试了很多办法去解决,只有将while(!con_Net_Flag);
WIFI GOT IP
bug的现象 bug出现的原因是:while(!con_Net_Flag);
是个延时bug。
我在这里尝试了很多办法去解决,只有将while(!con_Net_Flag);
和中断函数中检测WIFI GOT IP
的代码if(buffer[0]\=='W' && buffer[5]=='G'){con_Net_Flag = 1;memset(buffer,'\0',SIZE);}
注释掉既可以解决。
if(buffer[0]=='F' && buffer[1] == 'A') 进入联网失败检测代码
{
statusLED1(); 操作LED1闪烁5次
sendString(RESET); 发送重启ESP8266WiFi模块指令
Delay1000ms(); 等待1秒
sendString(cNetwork); 发送联网指令,这一步实现重新联网。
memset(buffer,'\0',SIZE); 清除buffer里面的字符。
}
#include "reg52.h"
#include "string.h"
#include "intrins.h"
#define SIZE 32
sfr AUXR = 0x8e; //声明AUXR寄存器地址
sbit LED1 = P3^7; //使用位定义声明LED1
sbit LED2 = P3^6; //使用位定义声明LED2
char buffer[SIZE]; //接收返回指令标志
code char cNetwork[] = "AT+CWJAP=\"a\",\"123456789\"\r\n"; //连接网络指令,\"为转译功能,code的功能是单独存放大数据
code char cServer[] = "AT+CIPSTART=\"TCP\",\"192.168.253.12\",5000\r\n"; //连接服务器
char oTransparent[] = "AT+CIPMODE=1\r\n"; //打开透传
char rTimeT[] = "AT+CIPSEND\r\n"; //打开实时发送
char RESET[] = "AT+RST\r\n"; //重启指令
//char con_Net_Flag = 0; //定义联网等待标志,这个标志会卡,不要用
char at_OK_Flag = 0; //定义指令执行成功等待标志
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void UartInit(void) //自己配
{
//配置串口工作方式为方式1,从只收不发改为能收能发
SCON = 0x50;
//配置辅助寄存器,减少电磁辐射,稳定晶振频率
AUXR = 0x01;
//设置定时器工作方式为定时器1的8位自动重装
TMOD &= 0x0F;
TMOD |= 0x20;
//设置串口波特率为9600,0误差
TH1 = 0xFD;
TL1 = 0xFD;
//打开定时器1
TR1 = 1;
//打开总中断
EA = 1;
//打开串口中断
ES = 1;
}
void sendByte(char data_mas)
{
SBUF = data_mas;
while(!TI);
TI = 0; //一定要软件置零,不然会出现乱序
}
void sendString(char *str)
{
while(*str != '\0')
{
sendByte(*str);
str++;
}
}
void statusLED1()
{
char i;
for(i=0; i<5; i++)
{
LED1 = 0;
Delay500ms();
LED1 = 1;
Delay500ms();
}
}
int main()
{
//初始化串口,配置波特率
UartInit();
//休眠1秒,让ESP8266发送乱码
Delay1000ms();
//初始化状态灯,使熄灭。
LED1 = 1;
LED2 = 1;
//发送联网指令
sendString(cNetwork);
//等待联网成功
//while(!con_Net_Flag);
while(!at_OK_Flag);
at_OK_Flag =0; //回归初识状态方便下次使用。
//发送连接服务器指令
sendString(cServer);
//等待连接服务器成功
while(!at_OK_Flag);
at_OK_Flag =0;
//发送打开透传模式指令
sendString(oTransparent);
//等待打开透传模式
while(!at_OK_Flag);
at_OK_Flag =0;
//发送打开实时发送指令
sendString(rTimeT);
//等待打开实时发送
while(!at_OK_Flag);
if(at_OK_Flag)
{
LED1 = 0;
LED2 = 0; //联网和打开透传模式成功LED2亮
}
//每延时1秒向电脑发送数据a
/*Delay1000ms();
sendString("一起来学串口通信!!!\r\n"); //\r\n 为串口中的换行,缺一不可
//怎么知道PC发了数据:由手册可知RI位为接受中断标志位,所以用查询的方法来判断RI是否等于1来开关灯*/
while(1)
{
sendString("网络配置完毕!\r\n");
Delay1000ms();
}
}
void UART_handler() interrupt 4
{
//定义临时变量tmp用于判断接收的字符是否是需要的首字符。
char tmp;
//定义一个静态整型变量,在多次函数调用中只被执行一次初始化
static int i = 0;
//在串口中段函数中可以对发送接收中断标志进行处理
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')
{
con_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')
{
statusLED1();
sendString(RESET);
Delay1000ms();
sendString(cNetwork);
memset(buffer,'\0',SIZE);
}
//如果用1指令开灯,0指令关灯
if(buffer[0]=='L' && buffer[2]=='1')
{
LED1 = 0;
memset(buffer,'\0',SIZE);
}
if(buffer[0]=='L' && buffer[2]=='0')
{
LED1 = 1;
memset(buffer,'\0',SIZE);
}
if(i == SIZE)
{
i = 0;
}
}
if(TI);
}
调试方法用白盒调试法。
ESP8266 wifi
模块通过USB转TTL
连接电脑,打开ESP8266串口调试助手(配置端口为COM8,波特率为9600“根据自己电脑来配”)
。ESP8266串口调试助手
发送AT+RST
实现重启模块
ESP8266串口调试助手
发送AT+CWMODE=3
实现配置模块工作在双模模式
。电脑
连接ESP8266
提供的热点。
ESP8266串口调试助手
发送AT+CIPMUX=1
实现模块使能多连接
ESP8266串口调试助手
发送AT+CIPSERVER=1
实现模块建立TCPServer
PC网络调试助手
连接ESP8266模块
ESP8266串口调试助手
发送AT+CIPSEND=0,4
在0通道
上发送4个字节
ESP8266串口调试助手
发送AT+CIPCLOSE=0
断开PC网络调试助手
。TXD——RXD
RXD——TXD
5V ——3V3
GND——GND
ESP8266串口调试助手
发送AT+RST
实现重启模块
ESP8266串口调试助手
发送AT+CWMODE=3
实现配置模块工作在双模模式
。电脑
连接ESP8266
提供的热点。
ESP8266串口调试助手
发送AT+CIPMUX=1
实现模块使能多连接
ESP8266串口调试助手
发送AT+CIPSERVER=1
实现模块建立TCPServer
PC网络调试助手
连接ESP8266模块
ESP8266串口调试助手
发送AT+CIFSR
实现查询ESP8266模块IP地址
PC命令提示符
中输入ipconfig
查询电脑IP地址
PC网络调试助手
进行连接
ESP8266串口调试助手
发送AT+CIPSEND=0,4
在0通道
上发送4个字节
ESP8266串口调试助手
发送AT+CIPCLOSE=0
断开PC网络调试助手
PC网络调试助手
发送数据给ESP8266模块
一个汉字占2字节,所以16字节刚好是“网络配置完毕!\r\n”所需要的字节
)指令字符串,定义指令执行成功等待标志,终端连接服务器成功标志。一个汉字占2字节,所以16字节刚好是“网络配置完毕!\r\n”所需要的字节
)指令字符串,定义指令执行成功等待标志,终端连接服务器成功标志。char routeMode[] = "AT+CWMODE=2\r\n"; //打开路由模式
char moreJoin[] = "AT+CIPMUX=1\r\n"; //打开使能多连接
char setUpServer[] = "AT+CIPSERVER=1\r\n"; //建立服务器
char sendData[] = "AT+CIPSEND=0,16\r\n"; //发送16个字节数据给终端
char at_OK_Flag = 0; //定义指令执行成功等待标志
char at_Cli_Con_Flag = 0; //终端连接服务器标志
//发送打开路由模式
sendString(routeMode);
//等待指令执行成功返回OK
while(!at_OK_Flag);
//让OK标志的值返回零,方便下次使用
at_OK_Flag = 0;
//发送打开使能多链接
sendString(moreJoin);
//等待指令执行成功返回OK
while(!at_OK_Flag);
//让OK标志的值返回零,方便下次使用
at_OK_Flag = 0;
//发送建立服务器指令
sendString(setUpServer);
//等待指令执行成功返回OK
while(!at_OK_Flag);
if(at_OK_Flag)
{
statusLED1(); //建立服务器完成后让LED1闪烁5次,方便用PC网络助手连接
}
//让OK标志的值返回零,方便下次使用
at_OK_Flag = 0;
//等待PC网络助手连接
while(!at_Cli_Con_Flag);
//PC网络助手连接成功让两颗LED亮
if(at_Cli_Con_Flag)
{
LED1 = 0;
LED2 = 0;
}
算法思路在程序注释中
算法代码
//检测通过串口传回的数据是否是0开头,O开头,:开头,如果是,强行将字符数组标号置0
if(tmp=='0' || tmp=='O' || tmp==':')
{
i = 0;
}
//将tmp中的字符串存入buffer中
buffer[i++] = tmp;
//检测返回的字符串是否为OK,是就将OK标志置1,退出等待循环
if(buffer[0]=='O' && buffer[1]=='K')
{
at_OK_Flag = 1;
memset(buffer,'\0',SIZE);
}
//检测返回的字符串是否为0,C开始,是就将连接终端标志置1,退出等待循环
if(buffer[0]=='0' && buffer[2]=='C')
{
at_Cli_Con_Flag = 1;
memset(buffer,'\0',SIZE);
}
//如果用op指令开灯,cl指令关灯
//检测返回的字符是否为:op和:cl开始,:op时打开灯,:cl时关灯
if(buffer[0]==':' && buffer[1]=='o' && buffer[2]=='p')
{
LED1 = 0;
memset(buffer,'\0',SIZE);
}
if(buffer[0]==':' && buffer[1]=='c' && buffer[2]=='l')
{
LED1 = 1;
memset(buffer,'\0',SIZE);
}
//防止指针越界
if(i == SIZE)
{
i = 0;
}
#include "reg52.h"
#include "string.h"
#include "intrins.h"
#define SIZE 32
sfr AUXR = 0x8e; //声明AUXR寄存器地址
sbit LED1 = P3^7; //使用位定义声明LED1
sbit LED2 = P3^6; //使用位定义声明LED2
char buffer[SIZE]; //接收返回指令标志
char routeMode[] = "AT+CWMODE=2\r\n"; //打开路由模式
char moreJoin[] = "AT+CIPMUX=1\r\n"; //打开使能多连接
char setUpServer[] = "AT+CIPSERVER=1\r\n"; //建立服务器
char sendData[] = "AT+CIPSEND=0,16\r\n"; //发送16个字节数据给终端
char at_OK_Flag = 0; //定义指令执行成功等待标志
char at_Cli_Con_Flag = 0; //终端连接服务器标志
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void UartInit(void) //自己配
{
//配置串口工作方式为方式1,从只收不发改为能收能发
SCON = 0x50;
//配置辅助寄存器,减少电磁辐射,稳定晶振频率
AUXR = 0x01;
//设置定时器工作方式为定时器1的8位自动重装
TMOD &= 0x0F;
TMOD |= 0x20;
//设置串口波特率为9600,0误差
TH1 = 0xFD;
TL1 = 0xFD;
//打开定时器1
TR1 = 1;
//打开总中断
EA = 1;
//打开串口中断
ES = 1;
}
void sendByte(char data_mas)
{
SBUF = data_mas;
while(!TI);
TI = 0; //一定要软件置零,不然会出现乱序
}
void sendString(char *str)
{
while(*str != '\0')
{
sendByte(*str);
str++;
}
}
void statusLED1()
{
char i;
for(i=0; i<5; i++)
{
LED1 = 0;
Delay500ms();
LED1 = 1;
Delay500ms();
}
}
int main()
{
//初始化串口,配置波特率
UartInit();
//休眠1秒,让ESP8266发送乱码
Delay1000ms();
//初始化状态灯,使熄灭。
LED1 = 1;
LED2 = 1;
//发送打开路由模式
sendString(routeMode);
//等待指令执行成功返回OK
while(!at_OK_Flag);
//让OK标志的值返回零,方便下次使用
at_OK_Flag = 0;
//发送打开使能多链接
sendString(moreJoin);
//等待指令执行成功返回OK
while(!at_OK_Flag);
//让OK标志的值返回零,方便下次使用
at_OK_Flag = 0;
//发送建立服务器指令
sendString(setUpServer);
while(!at_OK_Flag);
if(at_OK_Flag)
{
statusLED1(); //建立服务器完成后让LED1闪烁5次,方便用PC网络助手连接
}
//让OK标志的值返回零,方便下次使用
at_OK_Flag = 0;
//等待PC网络助手连接
while(!at_Cli_Con_Flag);
//PC网络助手连接成功让两颗LED亮
if(at_Cli_Con_Flag)
{
LED1 = 0;
LED2 = 0;
}
while(1)
{
//发送12个字节数据给终端指令
sendString(sendData);
//延时2秒
Delay1000ms();
Delay1000ms();
//发送网络配置完毕数据
sendString("网络配置完毕!\r\n");
Delay1000ms();
Delay1000ms();
}
}
void UART_handler() interrupt 4
{
//定义临时变量tmp用于判断接收的字符是否是需要的首字符。
char tmp;
//定义一个静态整型变量,在多次函数调用中只被执行一次初始化
static int i = 0;
//在串口中段函数中可以对发送接收中断标志进行处理
if(RI == 1)
{
RI = 0; //必须软件置零
tmp = SBUF;
//检测通过串口传回的数据是否是0开头,O开头,:开头,如果是,强行将字符数组标号置0
if(tmp=='0' || tmp=='O' || tmp==':')
{
i = 0;
}
//将tmp中的字符串存入buffer中
buffer[i++] = tmp;
//检测返回的字符串是否为OK,是就将OK标志置1,退出等待循环
if(buffer[0]=='O' && buffer[1]=='K')
{
at_OK_Flag = 1;
memset(buffer,'\0',SIZE);
}
//检测返回的字符串是否为0,C开始,是就将连接终端标志置1,退出等待循环
if(buffer[0]=='0' && buffer[2]=='C')
{
at_Cli_Con_Flag = 1;
memset(buffer,'\0',SIZE);
}
//如果用op指令开灯,cl指令关灯
//检测返回的字符是否为:op和:cl开始,:op时打开灯,:cl时关灯
if(buffer[0]==':' && buffer[1]=='o' && buffer[2]=='p')
{
LED1 = 0;
memset(buffer,'\0',SIZE);
}
if(buffer[0]==':' && buffer[1]=='c' && buffer[2]=='l')
{
LED1 = 1;
memset(buffer,'\0',SIZE);
}
//防止指针越界
if(i == SIZE)
{
i = 0;
}
}
if(TI);
}
调试方法依旧用白盒调试,调试思路和1.7一样。
很高兴您能看到这里,点个赞再走呗。谢谢您啦!!!