寫在前面:ESP8266的使用教程還剩一點,更完收工!上一節講了通過十六進制顯示得知發送數據的方式和接收數據的格式,本節將會說明通過單片機如何實現數據的收發,相關的代碼和手冊請看“基於STM32的ESP8266使用教程(四)(短篇)”。
首先就是將命令以字符數組的形式表達出來:
- u8 at_cwmode[] = {0x41, 0x54, 0x2B, 0x43, 0x57, 0x4D, 0x4F, 0x44, 0x45, 0x3D,
- 0x33, 0x0D, 0x0A};//AT+CWMODE=3(回車)
- u8 at_rst[] = {0x41, 0x54, 0x2B, 0x52, 0x53, 0x54, 0x0D, 0x0A};//AT+RST(回車)
- u8 at_cwsap[] = {0x41, 0x54, 0x2B, 0x43, 0x57, 0x53, 0x41, 0x50, 0x3D, 0x22,
- 0x45, 0x53, 0x50, 0x38, 0x32, 0x36, 0x36, 0x5F, 0x54, 0x45,
- 0x53, 0x54, 0x22, 0x2C, 0x22, 0x31, 0x32, 0x33, 0x34, 0x35,
- 0x36, 0x37, 0x38, 0x39, 0x30, 0x22, 0x2C, 0x31, 0x2C, 0x33,
- 0x0D, 0x0A};//AT+CWSAP="ESP8266_TEST","1234567890",1,3(回車)
- u8 at_cipmux[] = {0x41, 0x54, 0x2B, 0x43, 0x49, 0x50, 0x4D, 0x55, 0x58,
- 0x3D, 0x31, 0x0D, 0x0A};//AT+CIPMUX=1(回車)
- u8 at_sipserver[] = {0x41, 0x54, 0x2B, 0x43, 0x49, 0x50, 0x53, 0x45, 0x52, 0x56,
- 0x45, 0x52, 0x3D, 0x31, 0x2C, 0x38, 0x30, 0x38, 0x30, 0x0D,
- 0x0A};//AT+CIPSERVER=1,8080(回車)
u8 at_cwmode[] = {0x41, 0x54, 0x2B, 0x43, 0x57, 0x4D, 0x4F, 0x44, 0x45, 0x3D, 0x33, 0x0D, 0x0A};//AT+CWMODE=3(回車) u8 at_rst[] = {0x41, 0x54, 0x2B, 0x52, 0x53, 0x54, 0x0D, 0x0A};//AT+RST(回車) u8 at_cwsap[] = {0x41, 0x54, 0x2B, 0x43, 0x57, 0x53, 0x41, 0x50, 0x3D, 0x22, 0x45, 0x53, 0x50, 0x38, 0x32, 0x36, 0x36, 0x5F, 0x54, 0x45, 0x53, 0x54, 0x22, 0x2C, 0x22, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x22, 0x2C, 0x31, 0x2C, 0x33, 0x0D, 0x0A};//AT+CWSAP="ESP8266_TEST","1234567890",1,3(回車) u8 at_cipmux[] = {0x41, 0x54, 0x2B, 0x43, 0x49, 0x50, 0x4D, 0x55, 0x58, 0x3D, 0x31, 0x0D, 0x0A};//AT+CIPMUX=1(回車) u8 at_sipserver[] = {0x41, 0x54, 0x2B, 0x43, 0x49, 0x50, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x3D, 0x31, 0x2C, 0x38, 0x30, 0x38, 0x30, 0x0D, 0x0A};//AT+CIPSERVER=1,8080(回車)
這些命令是初始化相關的命令,從上往下執行即可完成WIFI模塊上電后的初始化。在第一章中說過,在第一次初始化完成后,無需進行模式及WIFI名稱及密碼的配置,但是方便起見每次上電都進行一次配置,就無需判斷是否是第一次初始化了。
接下來就是寫初始化的函數了,需要說明的是初始化非常簡單,不需要通過返回值判斷初始化是否完成,故只進行了延時的操作:
- void ESP8266_Init(void){
- int i = 0;
- for(i = 0; i < 13; i++){
- USART1->DR = at_cwmode[i];//送出AT+CWMODE=3(回車)
- while((USART1->SR & 0x40) == 0);//直到發送成功
- }
- my_delay_ms(1000);
- for(i = 0; i < 8; i++){
- USART1->DR = at_rst[i];//送出AT+RST(回車)
- while((USART1->SR & 0x40) == 0);//直到發送成功
- }
- my_delay_ms(2000);
- for(i = 0; i < 42; i++){
- USART1->DR = at_cwsap[i];//送出AT+CWSAP="ESP8266_TEST","1234567890",1,3(回車)
- while((USART1->SR & 0x40) == 0);//直到發送成功
- }
- my_delay_ms(1000);
- for(i = 0; i < 13; i++){
- USART1->DR = at_cipmux[i];//送出AT+CIPMUX=1(回車)
- while((USART1->SR & 0x40) == 0);//直到發送成功
- }
- my_delay_ms(1000);
- for(i = 0; i < 21; i++){
- USART1->DR = at_cipserver[i];//送出AT+CIPSERVER=1,8080(回車)
- while((USART1->SR & 0x40) == 0);//直到發送成功
- }
- }
void ESP8266_Init(void){ int i = 0; for(i = 0; i < 13; i++){ USART1->DR = at_cwmode[i];//送出AT+CWMODE=3(回車) while((USART1->SR & 0x40) == 0);//直到發送成功 } my_delay_ms(1000); for(i = 0; i < 8; i++){ USART1->DR = at_rst[i];//送出AT+RST(回車) while((USART1->SR & 0x40) == 0);//直到發送成功 } my_delay_ms(2000); for(i = 0; i < 42; i++){ USART1->DR = at_cwsap[i];//送出AT+CWSAP="ESP8266_TEST","1234567890",1,3(回車) while((USART1->SR & 0x40) == 0);//直到發送成功 } my_delay_ms(1000); for(i = 0; i < 13; i++){ USART1->DR = at_cipmux[i];//送出AT+CIPMUX=1(回車) while((USART1->SR & 0x40) == 0);//直到發送成功 } my_delay_ms(1000); for(i = 0; i < 21; i++){ USART1->DR = at_cipserver[i];//送出AT+CIPSERVER=1,8080(回車) while((USART1->SR & 0x40) == 0);//直到發送成功 } }
簡單的說一下串口的兩個寄存器,USART是通用同步異步收發器,USART1->DR是數據寄存器,說明如下:
將要發送的數據放在數據寄存器中即可。
USART1->SR是狀態寄存器,說明如下:
- while((USART1->SR & 0x40) == 0);//直到發送成功
while((USART1->SR & 0x40) == 0);//直到發送成功
寄存器和0x40進行與運算,是判斷第6位中的數,當它為1時,發送完成,可進行接下來的操作。
在初始化完成后,可以進行數據的收發,在該項目中,需求是手機向單片機請求數據,故由手機端建立鏈接,單片機負責接收手機端發送的命令及反饋數據。USART1->SR的第5位說明如下:
於是通過以下代碼判斷接收到了數據:
- USART1->SR & 0x20
USART1->SR & 0x20
再讀取USART1->DR中的值即可。這里有一點要特別說明:WIFI收到的是字符串,若想要完整的接收字符串的內容,比較好的方法是通過USART1->SR的第5位產生中斷,每產生一個中斷意味着收到一個字符,將其保存到字符數組中。因為我的命令是一個字符,故在USART1->SR的第五位置高后進行延時,然后讀取,根據收到數據的格式可知,最后一位就是我需要的命令。但是如果收到的是字符串,請各位通過前述方法獲取完整字符串。
最后,通過“AT+CIPCLOSE=0”關閉鏈接。關於如何從單片機端建立鏈接請參考命令手冊,將會在整理后上傳至網盤。預告:接下來將會說明如何通過手機與單片機進行通信,時間未定。