1. 程式人生 > >ESP8266實現簡單控制STM32

ESP8266實現簡單控制STM32

原理:WIFI和電腦的通訊實質上是串列埠通訊,所以串列埠知識不能少。具體思路是首先STM32通過串列埠直接傳送AT指令給ESP8266進行配網,之後網路助手傳送資料,串列埠讀取資料,微控制器通過判斷是否接收到了該資料進行控制小燈。 我用的硬體是正點原子的探索者加ESP8266-01,ESP8266-01的執行電路在之前已經講過。 首先是配網過程,是基於AT指令的原理。 單片機發送AT指令給ESP8266,指令用十六進位制表示,如下程式碼

u8 at_cwmode[] = {0x00,0x41,0x54,0x2B,0x43,0x57,0x4D,0x4F,0x44,0x45,0x3D, 
                  0x33,0X0D,0x0A};  
u8 at_rst[] = {0x41, 0x54, 0x2B, 0x52, 0x53, 0x54, 0x0D, 0x0A};
u8 at_cwsap[]={0x41,0x54,0x2B,0x43,0x57,0x53,0x41,0x50,0x3D,0x22,0x45,0x53,0x50,0x38,0x32,0x36,0x36,0x22,
               0x2C,0x22,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x22,0x2C,0x31,0x2C,0x33,0x0D,0x0A};
u8 at_cipmux[]={0x41,0x54,0x2B,0x43,0x49,0x50,0x4D,0x55,0x58,0x3D,0x31,0x0D,0x0A};
u8 at_cipserver[]={0x41,0x54,0x2B,0x43,0x49,0x50,0x53,0x45,0x52,0x56,0x45,0x52,0x3D,0x31,0x2C,0x38,0x30,0x30,0x30,0x0D,0x0A};

主函式,這裡用網路助手除錯, 網路助手發一個1,微控制器讀取串列埠收到的這個1,然後判斷控制小燈翻轉

int main(void)
{ 
	u8 t=0;
	u8 len;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設定系統中斷優先順序分組2
	delay_init(168);		//延時初始化 
	uart_init(115200);	//串列埠初始化波特率為115200
	usart3_init(115200);
	LED_Init();		  		//初始化與LED連線的硬體介面 
	//AT指令配置wifi
	for(t=0;t<14;t++)
	{
		USART_SendData(USART3, at_cwmode[t]);         //向串列埠3傳送資料
		while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待發送結束
	}
	delay_ms(1000);

	for(t=0;t<8;t++)
	{
		USART_SendData(USART3, at_rst[t]);         //向串列埠3傳送資料
		while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待發送結束
	}
	delay_ms(1000);
	
	for(t=0;t<36;t++)
	{
		USART_SendData(USART3, at_cwsap[t]);         //向串列埠3傳送資料
		while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待發送結束
	}
	delay_ms(1000);
	
	for(t=0;t<13;t++)
	{
		USART_SendData(USART3, at_cipmux[t]);         //向串列埠3傳送資料
		while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待發送結束
	}
	delay_ms(1000);
	
	for(t=0;t<21;t++)
	{
		USART_SendData(USART3, at_cipserver[t]);         //向串列埠3傳送資料
		while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待發送結束
	}
	delay_ms(1000);
	while(1)
	{
		if(USART3_RX_STA&0x8000)
		{					   
			len=USART3_RX_STA&0x3fff;//得到此次接收到的資料長度
      //收到電腦發來的請求控制微控制器
			if(USART3_RX_BUF[len-1]==0x31)
			  LED1=!LED1;
			//把串列埠三接受到的資料傳給串列埠一
			//這部分儘量不要開啟,開啟之後會出現資料拆包粘包問題,差不多就是點兩下發送,才在那收到一次資料
			/*
			for(t=0;t<len;t++)
		  {
				 USART_SendData(USART1, USART3_RX_BUF[t]);         //向串列埠1傳送資料
			   while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束
		  }
			*/
			USART3_RX_STA=0;
		}
	}
}

具體步驟就是先網路助手連上ESP8266,然後傳送一個1,微控制器上的LED就翻轉了。