日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/4/16 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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模组通信问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。