900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > STM32 HAL库 串口DMA(收发)和STM32串口中断接收(接收时间管理机制)+ESP8266 wi

STM32 HAL库 串口DMA(收发)和STM32串口中断接收(接收时间管理机制)+ESP8266 wi

时间:2022-10-18 09:13:44

相关推荐

STM32 HAL库 串口DMA(收发)和STM32串口中断接收(接收时间管理机制)+ESP8266 wi

一、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模组通信问题

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。