ESP8266實現簡單控制STM32
阿新 • • 發佈:2018-12-10
原理: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就翻轉了。