[应用相关] stm32 通过AT指令配置esp8266

[复制链接]
 楼主| junpeng324 发表于 2018-7-9 21:19 | 显示全部楼层 |阅读模式
1.相关宏定义
  1. #define AT_MODE_CONFIG 0 //0,采用ES/RST硬件控制进入AT模式;
  2. #define ESP_RX_MAX_LEN   600
  3. #define MODE_TCP  0
  4. #define MODE_UDP  1
  5. #define AP      0
  6. #define STA     1
  7. #define STA_AP  2


 楼主| junpeng324 发表于 2018-7-9 21:20 | 显示全部楼层
2.ESP8266相关结构体
  1. struct ESP8266_Fram
  2. {
  3.     char data_buff[ESP_RX_MAX_LEN];
  4.     unsigned int len;
  5.     char rx_flag;
  6. };


 楼主| junpeng324 发表于 2018-7-9 21:22 | 显示全部楼层
3.串口初始化
  1. void USART1_Config(void)
  2. {
  3. GPIO_InitTypeDef GPIO_InitStructure;
  4. USART_InitTypeDef USART_InitStructure;

  5. /* config USART1 clock */
  6. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

  7. /* USART1 GPIO config */
  8. /* Configure USART1 Tx (PA.09) as alternate function push-pull */
  9. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  10. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  11. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  12. GPIO_Init(GPIOA, &GPIO_InitStructure);   

  13. /* Configure USART1 Rx (PA.10) as input floating */
  14. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  15. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  16. GPIO_Init(GPIOA, &GPIO_InitStructure);

  17. /* USART1 mode config */
  18. USART_InitStructure.USART_BaudRate = 115200;
  19. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  20. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  21. USART_InitStructure.USART_Parity = USART_Parity_No ;
  22. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  23. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  24. USART_Init(USART1, &USART_InitStructure);
  25. /* ê1?ü′??ú2?óê??D?? */
  26. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  27. /* ê1?ü′??ú2×ü?????D?D?? */
  28. USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);


  29. USART_Cmd(USART1, ENABLE);
  30.         MY_NVIC_Init(2,3,USART1_IRQn,2);
  31.         
  32. }


 楼主| junpeng324 发表于 2018-7-9 21:24 | 显示全部楼层
4.ESP8266初始化
  1. void esp8266_init(void)
  2. {
  3.    
  4.     USART1_Config();          //串口初始化
  5.    
  6.     esp8266_send_cmd("ATE0","OK",0,500);  //关闭回显
  7.     esp8266_Rst();
  8. }


 楼主| junpeng324 发表于 2018-7-9 21:25 | 显示全部楼层
5.串口1中断函数
  1. void USART1_IRQHandler(void)
  2. {   
  3.     char ch;
  4.     if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  5.     {
  6.         ch  = USART_ReceiveData( USART1 );
  7.         
  8.         if( record.len< ( ESP_RX_MAX_LEN - 1 ) )                       //?¤á?1??×??úD′?áê?·?
  9.         {
  10.            record.data_buff[record.len++]=ch;


  11.         }
  12.     }
  13.     if( USART_GetITStatus( USART1, USART_IT_IDLE ) == SET )                                         //êy?Y???óê?íê±?
  14.     {
  15.        //strEsp8266_Fram_Record .InfBit .FramFinishFlag = 1;
  16.        ch = USART_ReceiveData( USART1 );                                                              //óéèí?tDòáD??3y?D??±ê????(?è?áUSART_SR£?è?oó?áUSART_DR)
  17.      }


  18. }


 楼主| junpeng324 发表于 2018-7-9 21:26 | 显示全部楼层
6.ESP8266接收字符串函数
  1. char * ESP8266_ReceiveString ( FunctionalState enumEnUnvarnishTx )
  2. {
  3. char * pRecStr = 0;

  4. strEsp8266_Fram_Record .InfBit .FramLength = 0;
  5. strEsp8266_Fram_Record .InfBit .FramFinishFlag = 0;
  6. while ( ! strEsp8266_Fram_Record .InfBit .FramFinishFlag );
  7. strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ] = '\0';

  8. if ( enumEnUnvarnishTx )
  9. {
  10. if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, ">" ) )
  11. pRecStr = strEsp8266_Fram_Record .Data_RX_BUF;


  12. }

  13. else
  14. {
  15. if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+IPD" ) )
  16. pRecStr = strEsp8266_Fram_Record .Data_RX_BUF;
  17. }


 楼主| junpeng324 发表于 2018-7-9 21:28 | 显示全部楼层
7.对ESP8266模块发送AT指令
  1. bool esp8266_send_cmd(char *cmd,char *reply,char *reply1,u32 waittime)
  2. {
  3.     char cstr[20];
  4.     record.len=0;           //接收长度清零  
  5.     IWDG_Feed();
  6.     printf("%s\r\n",cmd);
  7.    
  8.     if(reply==NULL&&reply1==NULL)
  9.       return true;
  10.     delay_ms(waittime);
  11.     record.data_buff[record.len]='\0';
  12.     if(reply!=0&&reply1!=0)
  13.         return ((bool)strstr(record.data_buff,reply)||(bool)strstr(record.data_buff,reply1));
  14.     else if(reply!=0)
  15.         return (bool)strstr(record.data_buff,reply);
  16.     else
  17.         return (bool)strstr(record.data_buff,reply1);
  18. }


 楼主| junpeng324 发表于 2018-7-9 21:34 | 显示全部楼层
8.ESP8266模块发送字符串
  1. bool esp8266_send_data(u8 enuvarnishTx,char *pStr,u32 len,u8 ucid)
  2. {
  3.     char cstr[20];
  4.    
  5.     bool bRet=false;
  6.     if(enuvarnishTx)      //透传模式
  7.     {
  8.       printf("%s",pStr);
  9.     }
  10.     else
  11.     {
  12.        if(ucid<5)            //多连接模式
  13.        {
  14.           sprintf(cstr,"AT+CIPSEND=%d,%d",ucid,len);
  15.        }
  16.        else                 //单链接模式
  17.        {
  18.           sprintf(cstr,"AT+CIPSEND=%d",len);
  19.        }
  20.       // esp8266_send_cmd(cstr,">",0,500);
  21.        if(esp8266_send_cmd(cstr,">",0,500))       //发送
  22.        {
  23.       
  24.           //bRet=esp8266_send_cmd(pStr,"SEND OK",0,300);
  25.          delay_ms(100);
  26.          USART_Puts(USART1,pStr,len);
  27.          
  28.        }
  29.      }


  30.     return bRet;


  31. }





 楼主| junpeng324 发表于 2018-7-9 21:35 | 显示全部楼层
9.ESP8266模块进入透传模式
  1. bool esp8266_UnvarnishSend(void)
  2. {
  3.     bool return_flag;
  4.     return_flag=esp8266_send_cmd("AT+CIPMODE=1","OK",0,300)&&esp8266_send_cmd("AP+CIPSEND","\r\n",0,300);


  5. }


 楼主| junpeng324 发表于 2018-7-9 21:36 | 显示全部楼层
10.ESP8266模块开启或关闭多连接
  1. bool esp8266_Enable_MultipleId ( char enumEnUnvarnishTx )
  2. {
  3. char cStr [20];

  4. sprintf ( cStr, "AT+CIPMUX=%d", ( enumEnUnvarnishTx ? 1 : 0 ) );

  5. return esp8266_send_cmd( cStr, "OK", 0, 500 );

  6. }


 楼主| junpeng324 发表于 2018-7-9 21:37 | 显示全部楼层
11. ESP8266模块开启或关闭服务器模式
  1. bool esp8266_set_Server(u8 mode,char *pPortNum,char *pTimeover)
  2. {
  3.    char cCmd1[120],cCmd2[120];
  4.    if(mode)        //开启服务
  5.    {
  6.        sprintf(cCmd1,"AT+CIPSERVER=%d,%s",1,pPortNum);  //端口号字符串
  7.        sprintf(cCmd2,"AT+CIPSTO=%s",pTimeover);         //超时时间
  8.        return (esp8266_send_cmd(cCmd1,"OK",0,300)&&esp8266_send_cmd(cCmd1,"OK",0,300));
  9.       
  10.    }
  11.    else           //关闭
  12.    {
  13.         sprintf(cCmd1,"AT+CIPSERVER=%d,%s",0,pPortNum);  //端口号字符串
  14.         return esp8266_send_cmd(cCmd1,"OK",0,300);
  15.    }


  16. }




 楼主| junpeng324 发表于 2018-7-9 21:38 | 显示全部楼层
12.ESP8266模块连接外部服务器
  1. bool esp8266_link_Server(u8 tcp_ip_mode,char *ip,char *comNum,char *LocalcomNum,u8 ucid)
  2. {
  3.     char cStr[100],cCmd[120];
  4.    
  5.     switch(tcp_ip_mode)
  6.     {
  7.         case MODE_TCP:
  8.            sprintf(cStr,""%s","%s",%s","TCP",ip,comNum);  //端口号字符串
  9.           break;
  10.         case MODE_UDP:
  11.           sprintf(cStr,""%s","%s",%s,%s,0","UDP",ip,comNum,LocalcomNum);  
  12.           break;
  13.         default:
  14.           break;
  15.     }
  16.      if(ucid<5)            //多连接模式
  17.      {
  18.         sprintf(cCmd,"AT+CIPSTART=%d,%s",ucid,cStr);
  19.      }
  20.      else                 //单链接模式
  21.      {
  22.         sprintf(cCmd,"AT+CIPSTART=%s",cStr);
  23.      }
  24.    
  25.     return esp8266_send_cmd(cCmd,"OK",0,300);   
  26.    
  27. }



 楼主| junpeng324 发表于 2018-7-9 21:39 | 显示全部楼层
13.ESP8266创建WIFI热点
  1. bool esp8266_Build_AP(char *pSSID,char *pPassWord,u8 *mode)
  2. {


  3.    char cCmd[120];
  4.    sprintf(cCmd,"AT+CWSAP"%s","%s",1,%s",pSSID,pPassWord,mode);
  5.    return esp8266_send_cmd(cCmd,"OK",0,300);   


  6. }


 楼主| junpeng324 发表于 2018-7-9 21:44 | 显示全部楼层
14.ESP8266模块连接外部wifi
  1. bool esp8266_Join_AP(char *pSSID,char *pPassWord)
  2. {


  3.    char cCmd[120];
  4.    sprintf(cCmd,"AT+CWJAP"%s","%s"",pSSID,pPassWord);
  5.    return esp8266_send_cmd(cCmd,"OK",NULL,1000);   


  6. }


 楼主| junpeng324 发表于 2018-7-9 21:45 | 显示全部楼层
15.选择ESP8266模块的工作模式
  1. bool esp8266_Net_mode_Choose(u8 enumMode)
  2. {
  3.    
  4.    switch(enumMode)
  5.     {
  6.         case STA:
  7.            return esp8266_send_cmd("AT+CWMODE=1","OK","no change",1000);  
  8.            break;
  9.         case AP:
  10.            return esp8266_send_cmd("AT+CWMODE=2","OK","no change",1000);  
  11.            break;
  12.         case STA_AP:
  13.            return esp8266_send_cmd("AT+CWMODE=3","OK","no change",1000);   
  14.            break;
  15.         default:
  16.           break;
  17.     }
  18. }


 楼主| junpeng324 发表于 2018-7-9 21:48 | 显示全部楼层
16.重启ESP8266模块
  1. void esp8266_Rst(void)
  2. {


  3.     esp8266_send_cmd("AT+RST","OK","ready",2500);   




  4. }


 楼主| junpeng324 发表于 2018-7-9 21:49 | 显示全部楼层
17.对ESP8266模块进行AT指令测试
  1. void esp8266_AT_test(void)
  2. {


  3.     while(!esp8266_send_cmd("AT","OK",NULL,1000))
  4.       esp8266_Rst();


  5. }


 楼主| junpeng324 发表于 2018-7-9 21:50 | 显示全部楼层
18.使能/禁用ESP8266
  1. void esp8266_EN_Choose(FunctionalState  enumChoose)
  2. {
  3.     if(enumChoose==ENABLE)
  4.       esp8266_Rst();
  5. }


 楼主| junpeng324 发表于 2018-7-9 21:50 | 显示全部楼层
以上函数可以封装在ESP8266.c文件中,作为对ESP8266模块的驱动
 楼主| junpeng324 发表于 2018-7-9 21:51 | 显示全部楼层
对于不同行的串口,需要更改串口配置和中断服务函数,大多数使用串口2与串口3
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

1130

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部