一、HAL库 串口 DMA+ESP8266模组通信问题

用STM32 HAL库串口的DMA发送和空闲中断接收处理数据,单片机发送AT指令给ESP8266 wifi模组问题:单片机连续几次给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次,打印出来的数据如下:

二、HAL库 串口中断(不用DMA,用串口接收中断时间管理机制处理接收数据)

在用串口中断(接收数据帧用时间管理机制来实现)时,调了好半天没调出来,单片机给ESP8266模组发送AT指令,然后单片机接收ESP8266模组的应答,第一次总是接收不到,后面把下面用红色标出的延时时间加长,才准确的接收ESP8266模组的应答。才发现是读的太快,还没等ESP8266模组应答,就去读,所以读不到ESP8266模组的应答。如果是单片机给ESP8266模组发送“AT+RST\r\n”指令,需要等待500-1000ms的时间,才能准确读到ESP8266模组的应答。

bool sendWifiCmd(uint8_t *cmd,uint16_t len,uint8_t *ack,uint16_t waittime)   //单片机给wifi模组发送AT指令
{
        uint8_t xlen,buf[512];
        wifiSend(cmd,len);
        delay_ms(waittime);
//     if(wifiAtAckCmp(ack)){
//        return TRUE;      //返回TRUE说明wifi模组已有应答
//     }
        xlen = wifiRead(buf,sizeof(buf));                                                         //串口中断接收数据处理,延时50-100ms
        if(strstr((const char *)buf,(const char*)ack)){
            rs485Send(buf,xlen);
            xlen = 0;
            memset(buf,0,DATALEN(buf));
            return true;    //返回TRUE说明wifi模组已有应答
        }

return false;        //返回FALSE说明wifi模组没有应答
 }

延时时间不够长:下图是单片机给ESP8266模组发送5次"AT+RST\r\n"指令,单片机读的太快,所以有时能读到,有时读不到,故需要把什么的延时时间加长。

把延时时间稍微加长,确保能正确读到ESP8266的应答数据,如下图:

完结,问题圆满解决!

STM32 HAL库 串口DMA(收发)和STM32串口中断接收(接收时间管理机制)+ESP8266 wifi模组通信问题相关推荐

  1. STM32 HAL库 CubeMX教程(五)串口通信基础

    STM32 HAL库 CubeMX教程(五)串口通信基础 串口通信简介 CubeMX配置 初始化程序分析 程序编写 参考文献 STM32 HAL库 CubeMX系列教程 目录 串口通信简介 UART: ...

  2. STM32 HAL库--串口的DMA(发送、接收)和esp8266 wifi模组发送和接收封装函数

    编写日期:2018年8月25日 /* ********************************************************************************* ...

  3. STM32 HAL库开发学习笔记: USART1串口通讯(中断方式) IDE-STM32CubeIDE

    STM32串口通讯有三种方式,分别为阻塞(轮询).中断.DMA.这里将用中断的方式开发. 笔者也是刚入门STM32 HAL库开发,该笔记致希望于能帮到初学者,文中配置步骤.代码.实验现象均是笔者实践可 ...

  4. STM32 HAL库ADC+DMA(非定时器)代码和遇到的问题

    目录 一.整体说明 二.部分知识点预览 三.代码部分 四.遇到的问题及现象 (1)仿真进入错误 (2)非连续模式软件触发时adcbuf里面的数据不对 (3)HAL库的ADC DMA相关中断的嵌套实现 ...

  5. 【STM32 HAL库+STM32CUBEMX】使用usart1打印串口数据

    1.设置RRC外部时钟 设置高速外部时钟 2.设置DEBUG调试 debug设置成SW 3.设置usart 设置模式为异步通信 比特率115200 起始位8位 停止位1位 没有奇偶效验 4.设置时钟 ...

  6. STM32 HAL库 PWM+DMA 驱动WS2812B彩灯(STM32F030F4P6)

    谁不想拥有炫酷的小彩灯呢?WS2812B可以给你机会...... 博主使用STM32驱动WS2812B主要参考了这位佬的文章,因为需求问题,采用了Cortex-M0的stm32f030f4p6(16k ...

  7. STM32 HAL库学习系列第13篇---串口重定向配置--printf

    我的首发平台是公众号[CodeAllen],学习交流QQ群:736386324,本文版权归作者所有,转载请注明出处 发送函数重定向 之后就可以使用输入输出函数 /******************* ...

  8. 如何快速使用STM32 HAL库和涂鸦Wi-Fi模组进行通信

     简介:本文将教大家如何使用STM32HAL库快速开发和涂鸦WIFI模组通信,接入涂鸦云. 实现功能:通过APP实时监测温湿度数据 程序下载路径:demo程序. demo(定时采集数据)程序. 一.使 ...

  9. STM32 HAL库串口同时收发,接收卡死?

    STM32 使用 HAL库串口同时收发,使用踩坑史 = =!......by 矜辰所致 目录 前言 一. HAL 库串口收发 1.1 串口发送 1.2 串口接收 1.2.1 标准库接收 1.2.1 H ...

最新文章

  1. c++ make_pairpair
  2. TensorRT5 yoloV3加速
  3. 渗透知识-SQL注入
  4. oracle中的null 字段,Oracle下的NULL字段
  5. 图像二维离散傅里叶变换、幅度谱、相位谱
  6. 沫沫金:收集Hibernate使用过程中的小技巧(不断更新)
  7. 【Kafka】使用confluent本地安装和使用kafka
  8. IIS访问要求输入用户名密码
  9. ztree的树形结构不能正常显示原因
  10. asp.net长文章插入分页符^进行分页
  11. Clark与Park变换详解
  12. 史上最全自媒体推广工具
  13. java中md5加密解密_「md5加密解密」Java实现MD5加密解密 - seo实验室
  14. 基于STM32H7的ADS1256驱动案例,8通道,24bit ADC,带可编程增益(2021-09-20)
  15. 所谓的不撞南墙不回头
  16. 高质量文章导航-持续更新中
  17. unicode字符集与编码
  18. Awesome Free ChatGPT(免费的chatgpt镜像网站)
  19. 这几款摸鱼神器,让我惊了!
  20. 标签设计(CodeSoft简单使用)

热门文章

  1. mysql DDL语句
  2. CentOS开启FTP及配置用户
  3. How I can Built A-Z index site map in my website
  4. Pat甲级 1001 A+B Format
  5. Pat乙级 1034 有理数四则运算
  6. 《众妙之门——Web用户体验设计与可用性测试》一2.3 总结
  7. DataGridView的DataGridViewComboBoxColumn列点击一次,自动处于编辑状态
  8. 通过AAA服务器使用XML文件为远程接入SSL ***认证授权
  9. Android实现CoverFlow效果
  10. Python——基础篇