(一)背景介绍
ESP8266是现在嵌入式领域中非常常用的WIFI模块,它的优点在于它便宜,皮实耐用。但是它也有它自身的缺陷。笔者实验发现,在ESP8266传输过程中有很大的概率会死机。这取决于接收设备的传输速度,因为串口的速度是非常快的,而发送的速度可能无法匹配所以在大量数据传输时非常容易因为堵塞模块内部内存而导致死机的现象,这里的死机并不是指单片机死机,但其实也差不多,因为在做TCP主机的时候,发送的数据量时必须事先给定的,这个时候死机就必须进行复位。
(二)实现方式
那么怎么做复位呢,之前想的办法就是定时器复位,可是总是这样复位也不行,于是就从底层的代码下手,做了一个死机判断,给一个固定时间超过就复位。这里因为我的工程本身不强调实时性,复位对进程影响不大如果你的工程非常强调实时性,你可以拉一根复位线出来,通过高低电平去复位模块效果一样。
(三)软件实现
u8 atk_8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
u8 res=0;
USART3_RX_STA=0;
u3_printf("%s\r\n",cmd); //发送命令
if(ack&&waittime) //需要等待应答
{
while(--waittime) //等待倒计时
{
delay_ms(10);
//在这里插入死机判断给复位信号
if(USART3_RX_STA&0X8000)//接收到期待的应答结果
{
if(atk_8266_check_cmd(ack))
{
printf("ack:%s\r\n",(u8*)ack);
break;//得到有效数据
}
USART3_RX_STA=0;
}
}
if(waittime==0)res=1;
}
return res;
}