STM32F429 使用ESP8266通訊心得


ESP8266是一款比較常見的WIFI通訊芯片,今天我給大家分享一下自己使用該芯片的心得。

我使用正點原子的 STM32F429 APOLLO作為開發載體的,雖然他們也有非常詳細的開發資料,但是我還是決定自己探索一下,過程也是比較坎坷,好在最終完成了預期效果。

第一步:接線:ESP8266的硬件連接還是很簡單的,其中只需要4線,連線如下:

ESP8266    STM32

RX       TX

TX       RX

VCC      VCC

GND      GND

第二步:硬件初始化,對ESP8266芯片進行初始化:

通過一塊USB-TTL模塊將ESP8266連接到電腦,利用串口調試助手進行初始化。硬件的初始化包括將芯片定義為熱點源還是連接熱點的設備(即AP模式還是STA模式),還有把芯片作為服務器 還是 客戶端(SERVER 還是 CLIENT),在我的實驗中,我選擇AP模式,並且將ESP8266作為服務器。這里解釋一下為什么選擇AP模式,如果將其作為STA,去連接其他熱點,比如路由器,手機熱點,電腦熱點,你還要先知道你所連接熱點的IP地址,更蛋疼的是這個IP地址是會變的,即使是同一台設備的熱點。芯片用作服務器還是客戶端,兩者其實差不多,因為其他設備一旦連接了ESP8266的WIFI,它的IP地址是固定的,比如ESP8266地址是192.168.4.1,那么第一,第二個連接該熱點的設備IP地址分別為192.168.4.2;192.168.4.3,以此類推。

只需用串口調試助手發送字符串給ESP8266即可,非常方便,初始化方法如上所示:

完成初始化后,你可以先用網絡調試助手試試能不能連接上,如果沒有問題那就進行下一步:

個人用這個芯片的時候發現,每次重新上電,你必須再它發一次:AT+CIPMUX=1和AT+CIPSERVER=1,8086,因此你再單片機初始化時用串口一下,比如博主寫了這樣一個函數:

 

void ESP8266_Init(void) {
	delay_ms(10);
	HAL_UART_Transmit(&huart3,(u8*)"AT+CIPMUX=1\r\n",100,100);
	delay_ms(10);
	HAL_UART_Transmit(&huart3,(u8*)"AT+CIPSERVER=1,8086\r\n",100,100);
	delay_ms(10);
}

 

然后在主程序里面調用一下就OK了。

再就是發送消息的問題了,這個芯片發送消息需要先寫一行AT指令。這部分我還沒測試成功,等下次做好了再補上。

信息傳到單片機后,通過串口中斷的方式進行讀取。有一點需要注意的是:單片機接收到的完整信號是:

開頭一個回車換行符0x0d,0x0a,然后是一個‘+’,接着“IPD,m,n:message”,其中m為連接的設備序號,從0開始,n為字節數,沒有結尾標記。message為信息具體如下圖所示(ST-LINK中觀察到的):

 

 所以我設計的接收程序為:

void ReadEsp8266Message(void){
	static u8 ESP8266FLAG1, ESP8266FLAG2, ESP8266FLAG3 = 0;
	static u16 Number = 0;
	static u16 Counter = 0;
	if (ESP8266FLAG3) {
		Usart_ReceiveBuffer[Counter++] = TempChar;
		Number--;
		if (Number == 0) {
			memcpy(USART3MESSAGE, Usart_ReceiveBuffer, RX_Length);
			for (int i = 0; i < RX_Length; i++)
				Usart_ReceiveBuffer[i] = 0;
			LCD_Fill(0, 150, 479, 179, WHITE);
			POINT_COLOR = BLACK;
			LCD_ShowString(30,150,800,24,24,(char*)USART3MESSAGE);
			ESP8266FLAG3 = 0;
			Counter = 0;
			Number = 0;
		}
	}
	if (ESP8266FLAG2 && TempChar != ':'){
		Number = Number*10 + (TempChar - '0');
	}
	else if (ESP8266FLAG2 && TempChar == ':') {
		ESP8266FLAG2 = 0;
		ESP8266FLAG3++;
	}
	if (TempChar == ',') {
		ESP8266FLAG1++;
		if (ESP8266FLAG1 == 2) {
			ESP8266FLAG2++;
			ESP8266FLAG1 = 0;
		}
	}
}

  然后再串口接收中斷函數中調用:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
	if (huart->Instance == USART3) {
		ReadEsp8266Message();
	}
}

  關於串口接收中斷的內容我打算在另一個博客里面寫,寫完以后我會在這里更新鏈接,大家也可參考別人寫的博客。

最終實現的效果:

 博主把接收到的信號打印在了一塊顯示屏上,甚至通過USMART組件執行接收的消息,關於usmart組件大家有興趣可以參考正點原子的資料,寫的很棒。

第一次寫博客,寫的亂七八糟的,就當是給自己記筆記了吧。歡迎大家交流和討論。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM