STM32 HAL库 串口DMA(收发)和STM32串口中断接收(接收时间管理机制)+ESP8266 wifi模组通信问题
一、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模组通信问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习《FreeRTOS源码详解与应用开发
- 下一篇: STM32 HAL库--串口的DMA(发