1. 程式人生 > >基於STM32的ESP8266使用教程(三)

基於STM32的ESP8266使用教程(三)

寫在前面: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(回車)

這些命令是初始化相關的命令,從上往下執行即可完成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);//直到傳送成功
	}
}

簡單的說一下串列埠的兩個暫存器,USART是通用同步非同步收發器,USART1->DR是資料暫存器,說明如下:


將要傳送的資料放在資料暫存器中即可。

USART1->SR是狀態暫存器,說明如下:


while((USART1->SR & 0x40) == 0);//直到傳送成功
暫存器和0x40進行與運算,是判斷第6位中的數,當它為1時,傳送完成,可進行接下來的操作。

在初始化完成後,可以進行資料的收發,在該專案中,需求是手機向微控制器請求資料,故由手機端建立連結,微控制器負責接收手機端傳送的命令及反饋資料。USART1->SR的第5位說明如下:


於是通過以下程式碼判斷接收到了資料:

USART1->SR & 0x20
再讀取USART1->DR中的值即可。這裡有一點要特別說明:WIFI收到的是字串,若想要完整的接收字串的內容,比較好的方法是通過USART1->SR的第5位產生中斷,每產生一箇中斷意味著收到一個字元,將其儲存到字元陣列中。因為我的命令是一個字元,故在USART1->SR的第五位置高後進行延時,然後讀取,根據收到資料的格式可知,最後一位就是我需要的命令。但是如果收到的是字串,請各位通過前述方法獲取完整字串。

最後,通過“AT+CIPCLOSE=0”關閉連結。關於如何從微控制器端建立連結請參考命令手冊,將會在整理後上傳至網盤。預告:接下來將會說明如何通過手機與微控制器進行通訊,時間未定。