目錄
1. ESP8266模塊介紹
1.1. 系統(tǒng)結構圖
1.2. 功能介紹
?1.3. AT指令說明
?2. STM32連接ESP8266
3. ESP8266示例
3.1. ESP8266透傳模式
?3.2. ESP8266上傳數據例程
1. ESP8266模塊介紹
1.1. 系統(tǒng)結構圖
樂鑫智能互聯(lián)平臺——ESP8266 擁有高性能無線 SOC,是一個完整且自成體系的 WiFi 網絡解決方案,能夠獨立運行,也可以作為 slave 搭載于其他 Host 運行。
裝有ESP8266的系統(tǒng)表現(xiàn)出來的領先特征有:節(jié)能VoIP在睡眠/喚醒模式之間的快速切換、配合低功率操作的自適應無線電偏置、前端信號的處理功能、故障排除和無線電系統(tǒng)共存特性為消除蜂窩/藍牙/DDR/LVDS/LCD干擾。
?
?管腳定義:
1.2. 功能介紹
ESP8266 支持 softAP 模式,station 模式,softAP + station 共存模式三種。
利用 ESP8266 可以實現(xiàn)十分靈活的組網方式和網絡拓撲。
注,
SoftAP:即無線接入點,是一個無線網絡的中心節(jié)點。通常使用的無線路
由器就是一個無線接入點。
Station:即無線終端,是一個無線網絡的終端端。?
提供三種省電模式:
?1.3. AT指令說明
AT指令分類:?
指令集:
?2. STM32連接ESP8266
用STM32F103的USART3(PB10、PB11)連接ESP8266的URXD、UTXD,PB8連接CH-PD,PB9連接RST。
3. ESP8266示例
3.1. ESP8266透傳模式
打開CubeMX, 配置USART1和USART3,并且NVIC處Enable打√,USART1用于與電腦的串口調試助手連接,USART3用于與ESP8266的串口連接:
在main.c定義變量,并且配置非阻塞接收:
//main.c:
uint8_t revData[100];
uint8_t esp8266RevData[200];
int main(void)
{
HAL_UARTEx_ReceiveToIdle_IT(&huart1, revData, 100);
HAL_UARTEx_ReceiveToIdle_IT(&huart3, esp8266RevData, 200);
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
在usart.c文件中重寫HAL_UARTEx_RxEventCallback函數:
//usart.c:
#include <stdio.h>
extern uint8_t revData[100];
extern uint8_t esp8266RevData[200];
/* USER CODE BEGIN 1 */
int fputc(int ch,FILE *f)
{
HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,1000);
return ch;
}
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
if(huart->Instance==USART1)
{
// HAL_UART_Transmit(&huart1,revData,Size,10);
HAL_UART_Transmit(&huart3,revData,Size,10);
while(HAL_UARTEx_ReceiveToIdle_IT(&huart1, revData, 100) != HAL_OK);
}
else if(huart->Instance==USART3)
{
HAL_UART_Transmit(&huart1,esp8266RevData,Size,10);
while(HAL_UARTEx_ReceiveToIdle_IT(&huart3, esp8266RevData, 200) != HAL_OK);
}
}
/* USER CODE END 1 */
編譯并且燒錄至單片機,可以看到串口助手輸入指令后正確的得到反饋:
?3.2. ESP8266上傳數據例程
新增接收數據大小的變量:
//usart.c
uint16_t *esp8266Size;
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
if(huart->Instance==USART1)
{
// HAL_UART_Transmit(&huart1,revData,Size,10);
HAL_UART_Transmit(&huart3,revData,Size,10);
while(HAL_UARTEx_ReceiveToIdle_IT(&huart1, revData, 100) != HAL_OK);
}
else if(huart->Instance==USART3)
{
HAL_UART_Transmit(&huart1,esp8266RevData,Size,10);
esp8266Size=&Size;
while(HAL_UARTEx_ReceiveToIdle_IT(&huart3, esp8266RevData, 200) != HAL_OK);
}
}
編寫wifi AT指令的操作函數:
//usart.c
/*
* 函數名:cmdAT
* 描述 :對WF-ESP8266模塊發(fā)送AT指令
* 輸入 :cmdData,待發(fā)送的指令
* expReturn1,expReturn2,期待的響應,為NULL表不需響應,兩者為或邏輯關系
* 返回 : 1,指令發(fā)送成功
* 0,指令發(fā)送失敗
* 調用 :被外部調用
*/
_Bool cmdAT(char *cmdData,char *expReturn1,char *expReturn2)
{
char cmdDataTmp[40];
sprintf(cmdDataTmp,"%s\r\n",cmdData);
HAL_UART_Transmit(&huart3,(uint8_t *)cmdDataTmp,strlen(cmdDataTmp),10);
// printf("cmdDataTmp:%s\r\nlenth:%d",cmdDataTmp,sizeof((char *)cmdDataTmp)/sizeof(char));
if(expReturn1==NULL && expReturn2==NULL)
return 1;
HAL_Delay(100);
uint8_t count=0;
if(esp8266Size==0 || count<40)
{
HAL_Delay(200);
count++;
}
esp8266RevData[*esp8266Size]='\0';
esp8266Size=0;
if(expReturn2!=NULL)
return (((_Bool)strstr((const char *)esp8266RevData,expReturn1))||((_Bool)strstr((const char *)esp8266RevData,expReturn2)));
else
return ((_Bool)strstr((const char *)esp8266RevData,expReturn1));
}
_Bool testAT( void )
{
char count=0;
// ESP8266_RST_H;
printf("\r\n測試AT啟動\r\n");
HAL_Delay ( 100 );
while ( count < 5 )
{
printf("\r\n第%d次嘗試連接AT\r\n", count);
if( cmdAT ( "AT", "OK",NULL) )
{
printf("\r\nAT成功啟動\r\n");
return 1;
}
ESP8266_RST_L;
HAL_Delay(500);
ESP8266_RST_H;
HAL_Delay(1000);
++ count;
}
return 0;
}
_Bool ESP8266_DHCP_CUR (void)
{
return cmdAT( "AT+CWDHCP_CUR=1,1", "OK",NULL);
}
/*
* 函數名:ESP8266_Net_Mode_Choose
* 描述 :選擇WF-ESP8266模塊的工作模式
* 輸入 :enumMode,工作模式
* 返回 : 1,選擇成功
* 0,選擇失敗
* 調用 :被外部調用
*/
_Bool ESP8266_Net_Mode_Choose ( ENUM_Net_ModeTypeDef enumMode )
{
switch ( enumMode )
{
case STA:
return cmdAT ( "AT+CWMODE=1", "OK",NULL);
case AP:
return cmdAT ( "AT+CWMODE=2", "OK",NULL);
case STA_AP:
return cmdAT ( "AT+CWMODE=3", "OK",NULL);
default:
return 0;
}
}
/*
* 函數名:ESP8266_JoinAP
* 描述 :WF-ESP8266模塊連接外部WiFi
* 輸入 :pSSID,WiFi名稱字符串
* :pPassWord,WiFi密碼字符串
* 返回 : 1,連接成功
* 0,連接失敗
* 調用 :被外部調用
*/
_Bool ESP8266_JoinAP ( char * pSSID, char * pPassWord )
{
char cCmd [120];
sprintf ( cCmd, "AT+CWJAP=\"%s\",\"%s\"", pSSID, pPassWord );
return cmdAT ( cCmd, "OK",NULL);
}
/*
* 函數名:ESP8266_Enable_MultipleId
* 描述 :WF-ESP8266模塊啟動多連接
* 輸入 :enumEnUnvarnishTx,配置是否多連接
* 返回 : 1,配置成功
* 0,配置失敗
* 調用 :被外部調用
*/
_Bool ESP8266_Enable_MultipleId ( FunctionalState enumEnUnvarnishTx )
{
char cStr [20];
sprintf ( cStr, "AT+CIPMUX=%d", ( enumEnUnvarnishTx ? 1 : 0 ) );
return cmdAT ( cStr, "OK",NULL);
}
/*
* 函數名:ESP8266_Link_Server
* 描述 :WF-ESP8266模塊連接外部服務器
* 輸入 :enumE,網絡協(xié)議
* :ip,服務器IP字符串
* :ComNum,服務器端口字符串
* :id,模塊連接服務器的ID
* 返回 : 1,連接成功
* 0,連接失敗
* 調用 :被外部調用
*/
_Bool ESP8266_Link_Server ( ENUM_NetPro_TypeDef enumE, char * ip, char * ComNum, ENUM_ID_NO_TypeDef id)
{
char cStr [100] = { 0 }, cCmd [120];
switch ( enumE )
{
case enumTCP:
sprintf ( cStr, "\"%s\",\"%s\",%s", "TCP", ip, ComNum );
break;
case enumUDP:
sprintf ( cStr, "\"%s\",\"%s\",%s", "UDP", ip, ComNum );
break;
default:
break;
}
if ( id < 5 )
sprintf ( cCmd, "AT+CIPSTART=%d,%s", id, cStr);
else
sprintf ( cCmd, "AT+CIPSTART=%s", cStr );
return cmdAT ( cCmd, "OK","ALREADY CONNECTED");
}
/*
* 函數名:ESP8266_UnvarnishSend
* 描述 :配置WF-ESP8266模塊進入透傳發(fā)送
* 輸入 :無
* 返回 : 1,配置成功
* 0,配置失敗
* 調用 :被外部調用
*/
_Bool ESP8266_UnvarnishSend ( void )
{
if ( ! cmdAT ( "AT+CIPMODE=1", "OK", NULL ) )
return 0;
return
cmdAT ( "AT+CIPSEND", "OK", ">" );
}
在usart.h配置宏定義和函數聲明:
/* USER CODE BEGIN Private defines */
typedef enum{
STA,
AP,
STA_AP
} ENUM_Net_ModeTypeDef;
typedef enum{
enumTCP,
enumUDP,
} ENUM_NetPro_TypeDef;
typedef enum{
Multiple_ID_0 = 0,
Multiple_ID_1 = 1,
Multiple_ID_2 = 2,
Multiple_ID_3 = 3,
Multiple_ID_4 = 4,
Single_ID_0 = 5,
} ENUM_ID_NO_TypeDef;
/* USER CODE END Private defines */
void MX_USART1_UART_Init(void);
void MX_USART3_UART_Init(void);
/* USER CODE BEGIN Prototypes */
_Bool cmdAT(char *cmdData,char *expReturn1,char *expReturn2);
_Bool testAT( void );
_Bool ESP8266_DHCP_CUR (void);
_Bool ESP8266_Net_Mode_Choose ( ENUM_Net_ModeTypeDef enumMode );
_Bool ESP8266_JoinAP ( char * pSSID, char * pPassWord );
_Bool ESP8266_Enable_MultipleId ( FunctionalState enumEnUnvarnishTx );
_Bool ESP8266_Link_Server ( ENUM_NetPro_TypeDef enumE, char * ip, char * ComNum, ENUM_ID_NO_TypeDef id);
_Bool ESP8266_UnvarnishSend ( void );
/* USER CODE END Prototypes */
編寫初始化函數:
//esp8266_test.h
#ifndef __ESP8266_TEST_H__
#define __ESP8266_TEST_H__
#ifdef __cplusplus
extern "C" {
#endif
#define WIFI_SSID "nomi" //要連接的熱點的名稱
#define WIFI_PASSWORD "fdhgtdhrt" //要連接的熱點的密鑰
#define SERVER_IP "192.168.64.74" //要連接的服務器的 IP
#define SERVER_PORT "8000" //要連接的服務器的端口
void initEsp8266(void);
#ifdef __cplusplus
}
#endif
#endif /* __ESP8266_TEST_H__ */
//esp8266_test.c
#include "esp8266_test.h"
#include <stdio.h>
#include "usart.h"
void initEsp8266(void)
{
printf("\r\n開始測試AT啟動:\r\n");
if(testAT()==0)
{
printf("AT連接不上!");
return;
}
printf("\r\n設置DHCP獲?。篭r\n");
_Bool dhcpreturn=ESP8266_DHCP_CUR();
printf("testdhcpreturn:%d",dhcpreturn);
if(ESP8266_DHCP_CUR()==0)
{
printf("設置DHCP獲取失敗!\r\n");
}
printf("\r\n選擇WF-ESP8266模塊的工作模式為STA:\r\n");
if(ESP8266_Net_Mode_Choose(STA)==0)
{
printf("選擇WF-ESP8266模塊的工作模式失敗!\r\n");
}
printf("\r\n連接WiFi:\r\n");
if(ESP8266_JoinAP (WIFI_SSID,WIFI_PASSWORD)==0)
{
printf("WiFi連接不上!\r\n");
return;
}
printf("\r\nESP8266模塊啟動單連接:\r\n");
if(ESP8266_Enable_MultipleId (DISABLE)==0)
{
printf("ESP8266模塊啟動單連接失??!\r\n");
return;
}
HAL_Delay(2000);
printf("\r\n連接外部服務器:\r\n");
while(ESP8266_Link_Server (enumTCP,SERVER_IP,SERVER_PORT,Single_ID_0)==0)
{
printf("服務器連接不上!\r\n");
HAL_Delay(1000);
}
printf("\r\n進入透傳發(fā)送:\r\n");
if(ESP8266_UnvarnishSend()==0)
{
printf("進入透傳發(fā)送失??!\r\n");
return;
}
printf( "\r\n配置 ESP8266 完畢\r\n" );
printf ( "\r\n開始透傳......\r\n" );
}
在main.c寫初始化測試語句:
//main.c
HAL_UARTEx_ReceiveToIdle_IT(&huart1, revData, 100);
HAL_UARTEx_ReceiveToIdle_IT(&huart3, esp8266RevData, 200);
HAL_Delay(1000);
initEsp8266();
HAL_Delay(100);
HAL_UART_Transmit(&huart3,(uint8_t *)"wendu",5,10);
網絡助手打開監(jiān)聽模式。
運行程序,在串口助手中看到提示正常:
網絡助手正常收到消息:
?文章來源:http://www.zghlxwxcb.cn/news/detail-792792.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-792792.html
到了這里,關于STM32-連接wifi模塊(esp8266)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!