STM32 串口DMA(收发)+ESP8266 wifi模组问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/euxnijuoh/article/details/82086004

问题:单片机连续几次给wifi模组发送AT指令,wifi模块总是少一次的应答,在无线通信过程中是不方便和不允许的,因为在通信过程会通信不畅或中断,如果要远程升级程序,这不能达到远程升级需求。部分程序如下:

int mian(void)
{
    for(n = 1; n <= 5;n++){
          printf("单片机给WIFI模块发送第%d次AT指令!\r\n",n);
          DMA_usart3_send((uint8_t*)"AT+RST\r\n",sizeof("AT+RST\r\n")-1);    //单片机串口给wifi模组发送AT指令
          if(usart3_recv_end_flag == 1){                                                              //单片机是否接收到数据

                delay_ms(10);                                                                                 //稍微延时10ms
                usart3_recv_end_flag = 0;                                                              //把接收完成标志清零
                if(strstr((const char *)usart3_rx_buf,"OK")){                                    //判断wifi模组是否应答
                      rs485_send(usart3_rx_buf,usart3_rx_len);                               //把wifi模组应答信息打印出来
                      usart3_rx_len = 0;                                                                     //把接收数据长度清零
                      memset(usart3_rx_buf,0,DATA_BUFFER_SIZE);                    //把接收缓存器清零
                 }
          }                 
        delay_ms(500);                                                                                       //延时100ms
    }
}

单片机连续5次给wifi模组发送AT指令,但wifi模组只应答4次,打印出来的数据如下:

问题分析:

刚开始分析时,以为是单片机串口程序处理有问题,查找了两天时间一直没有找到问题,后把延时函数放在了前面,单片机给wifi模组发送一次AT指令,wifi模组就应答一次,分析:单片机给wifi模组发送AT指令后,需要稍微延时等待wifi模组应答,要不然会读不到wifi应答的AT指令,会达不到研发要求。程序更改后,可以满足开发需求。程序如下:

int mian(void)
{
    for(n = 1; n <= 5;n++){
         printf("单片机给WIFI模块发送第%d次AT指令!\r\n",n);
         DMA_usart3_send((uint8_t*)"AT+RST\r\n",sizeof("AT+RST\r\n")-1);    //单片机串口给wifi模组发送AT指令
         delay_ms(10);                                                                                        //稍微延时10ms
         if(usart3_recv_end_flag == 1){                                                              //单片机是否接收到数据
                usart3_recv_end_flag = 0;                                                             //把接收完成标志清零
                if(strstr((const char *)usart3_rx_buf,"OK")){                                   //判断wifi模组是否应答
                     rs485_send(usart3_rx_buf,usart3_rx_len);                               //把wifi模组应答信息打印出来
                     usart3_rx_len = 0;                                                                     //把接收数据长度清零
                     memset(usart3_rx_buf,0,DATA_BUFFER_SIZE);                    //把接收缓存器清零
                 }
          }             
        delay_ms(500);                                                                                      //延时100ms
    }
}

单片机连续5次给wifi模组发送AT指令,wifi模组应答5次,打印出来的数据如下:

问题圆满解决,继续码程序!

猜你喜欢

转载自blog.csdn.net/euxnijuoh/article/details/82086004