123下一页
返回列表 发新帖我要提问本帖赏金: 0.01元(功能说明)

[应用相关] stm32和esp8266wifi模块的代码分析和讲解

[复制链接]
 楼主| dongnanxibei 发表于 2016-9-22 14:03 | 显示全部楼层 |阅读模式
本帖最后由 dongnanxibei 于 2016-9-22 14:04 编辑

stm32f103和esp8266,进行串口通信。
1,对stm32进行串口端的初始化。选择usart2串口,对其初始化。
  1. /* Configure USART2 Tx (PA.02) as alternate function push-pull */
  2.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  3.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  4.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  5.   GPIO_Init(GPIOA, &GPIO_InitStructure);

  6.   /* Configure USART2 Rx (PA.03) as input floating */
  7.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  8.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  9.   GPIO_Init(GPIOA, &GPIO_InitStructure);

  10. /* USART2 mode config */
  11. USART_InitStructure.USART_BaudRate = 115200;               
  12. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  13. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  14. USART_InitStructure.USART_Parity = USART_Parity_No ;
  15. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  16. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  17. USART_Init(USART2, &USART_InitStructure);

  18. /* 使能串口2接收中断 */
  19. USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
  20. /* 使能串口2总线空闲中断 */
  21. USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);
  22. USART_Cmd(USART2, ENABLE);


注意选择115200的比特率*
为了方便可以把所以的都设置成115200,(不一定需要)
2,
这儿一定要修改。这是对esp8266的使能端口进行的处理,一定要正确,引脚的拉高和拉低很重要,这儿就是这个原因,我那个时候调试了很久很久。
  1. /*定义一个GPIO_InitTypeDef类型的结构体*/
  2.     GPIO_InitTypeDef GPIO_InitStructure;


  3.     /*开启GPIOA的外设时钟*/
  4.     RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );

  5.      /* 配置WiFi模块的片选(CH)引脚复位重启(RST)引脚*/

  6.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;  

  7.     /*设置引脚模式为通用推挽输出*/
  8.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

  9.     /*设置引脚速率为50MHz */   
  10.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  11.     /*调用库函数,初始化GPIOA*/
  12.     GPIO_Init( GPIOA, &GPIO_InitStructure );

  13.     /* 拉低WiFi模块的片选引脚    */
  14.     GPIO_SetBits( GPIOA, GPIO_Pin_0 );      

  15.     /* 拉高WiFi模块的复位重启引脚  */
  16.     GPIO_SetBits( GPIOA, GPIO_Pin_1 );


打赏榜单

山东电子小菜鸟 打赏了 0.01 元 2017-03-20

 楼主| dongnanxibei 发表于 2016-9-22 14:04 | 显示全部楼层
3, 对端口进行控制的处理,这里对串口2进行申明,然后需要在4中的文件添加数据,
  1. NVIC_InitTypeDef NVIC_InitStructure;

  2. /* Configure the NVIC Preemption Priority Bits */  
  3. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

  4. /* Enable the USART2 Interrupt */
  5. NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;   
  6. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  7. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  8. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  9. NVIC_Init(&NVIC_InitStructure);
4, 在stm32f10x_it.c文件中的串口2的处理函数中添加这段代码。这儿是串口中断处理函数。当有中断的时候,这段代码吧收到
的数据进行存储。存储在结构体里面,在5中有说明,很重要的终端处理函数/。
  1. void USART2_IRQHandler( void )
  2. {   
  3.     char ch;
  4.     //pStr = ESP8266_ReceiveString ( DISABLE );
  5.     if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
  6.     {


  7.         ch  = USART_ReceiveData( USART2 );
  8.         if( strEsp8266_Fram_Record .InfBit .FramLength < ( RX_BUF_MAX_LEN - 1 ) )   //预留1个字节写结束符
  9.         {
  10.             strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ++ ]  = ch;

  11.     }

  12. }

  13. if ( USART_GetITStatus( USART2, USART_IT_IDLE ) == SET )    //数据帧接收完毕
  14. {
  15.      strEsp8266_Fram_Record .InfBit .FramFinishFlag = 1;

  16.     ch = USART_ReceiveData( USART2 ); //由软件序列清除中断标志位(先读USART_SR,然后读USART_DR)
  17. }

  18. }


 楼主| dongnanxibei 发表于 2016-9-22 14:05 | 显示全部楼层
5,对应4中的结构体声明
个人觉得很重要,这样才可以在以后对数据收到的数据进行处理的时候,直接在结果体中进行取值和判断是否是想要的值,然后在进行相应的操作
  1. extern struct  STRUCT_USARTx_Fram                                  //串口数据帧的处理结构体
  2. {
  3.     char  Data_RX_BUF[ RX_BUF_MAX_LEN ];

  4.   union {
  5.     __IO u16 InfAll;
  6.     struct {
  7.           __IO u16 FramLength       :15;                               // 14:0
  8.           __IO u16 FramFinishFlag   :1;                                // 15
  9.       } InfBit;
  10.   };

  11. } strPc_Fram_Record, strEsp8266_Fram_Record;


  12. extern struct  STRUCT_USART1_1_Fram                                  //串口数据帧的处理结构体
  13. {
  14.     char  Data_RX_BUF[ RX_BUF_MAX_LEN ];

  15.   union {
  16.     __IO u16 InfAll;
  17.     struct {
  18.           __IO u16 FramLength       :15;                               // 14:0
  19.           __IO u16 FramFinishFlag   :1;                                // 15
  20.       } InfBit;
  21.   };

  22. } strPc1_1_Fram_Record, str1_1esp8266;


 楼主| dongnanxibei 发表于 2016-9-22 14:06 | 显示全部楼层
6,下面是一个最重要的方法。很多出可以使用,对于串口的esp8266模块很大的用处
对于at指令来说,这段代码是这个程序的核心,可以用这段代码完成这个操作。
函数返回值是布尔类型的,可以在while()里面调用这段函数,这样可以实现
一直循环的进行cmd操作,直到这句话进行完成以后才跳出。这样保证能够使得
每一条at指令都能执行,对于while不能一次性执行的at指令,程序将会一直执行
这条at指令,直到执行完成。
  1. /*
  2.      * 函数名:ESP8266_Cmd
  3.      * 描述  :对WF-ESP8266模块发送AT指令
  4.      * 输入  :cmd,待发送的指令
  5.      *         reply1,reply2,期待的响应,为NULL表不需响应,两者为或逻辑关系
  6.      *         waittime,等待响应的时间
  7.      * 返回  : 1,指令发送成功
  8.      *         0,指令发送失败
  9.      * 调用  :被外部调用
  10.      */
  11.     bool ESP8266_Cmd ( char * cmd, char * reply1, char * reply2, u32 waittime )
  12.     {   
  13.         strEsp8266_Fram_Record .InfBit .FramLength = 0;               //从新开始接收新的数据包

  14.         ESP8266_Usart ( "%s\r\n", cmd );

  15.         if ( ( reply1 == 0 ) && ( reply2 == 0 ) )                      //不需要接收数据
  16.             return true;

  17.         Delay_ms ( waittime );                 //延时

  18.         strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ]  = '\0';

  19.     //  PC_Usart ( "%s", strEsp8266_Fram_Record .Data_RX_BUF );

  20.         if ( ( reply1 != 0 ) && ( reply2 != 0 ) )
  21.             return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply1 ) ||
  22.                              ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply2 ) );

  23.         else if ( reply1 != 0 )
  24.             return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply1 ) );

  25.         else
  26.             return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply2 ) );


  27.     }

6,介绍一个很重要的函数,在C语言里面的,strstr();
这个特别的重要。对于这个程序来说。可以判断结构体内接受到的数据是否有自己想要的值,
然后,做出对应的操作,这样实现了远程控制的作用。
列入: strstr(a,b);
判断字符窜,a中是否有b一样的字符串。如果有,就返回真。
strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply1 )

7,主动发送数据的函数。自己调用很好的使用。能达到很不错的效果,下面的函数里面有这个函数的调用的使用。

  1. /*
  2. * 函数名:ESP8266_SendString
  3. * 描述  :WF-ESP8266模块发送字符串
  4. * 输入  :enumEnUnvarnishTx,声明是否已使能了透传模式
  5. *       :pStr,要发送的字符串
  6. *       :ulStrLength,要发送的字符串的字节数
  7. *       :ucId,哪个ID发送的字符串
  8. * 返回  : 1,发送成功
  9. *         0,发送失败
  10. * 调用  :被外部调用

  11. // ESP8266_SendString ( DISABLE, cStrInput, ul, ( ENUM_ID_NO_TypeDef ) uc );
  12. */
  13. bool ESP8266_SendString ( FunctionalState enumEnUnvarnishTx, char * pStr, u32 ulStrLength, ENUM_ID_NO_TypeDef ucId )
  14. {
  15.     char cStr [20];
  16.     bool bRet = false;

  17.     if ( enumEnUnvarnishTx )
  18.         ESP8266_Usart ( "%s", pStr );


  19.     else
  20.     {
  21.         if ( ucId < 5 )
  22.             sprintf ( cStr, "AT+CIPSEND=%d,%d", ucId, ulStrLength + 2 );

  23.         else
  24.             sprintf ( cStr, "AT+CIPSEND=%d", ulStrLength + 2 );

  25.         ESP8266_Cmd ( cStr, "> ", 0, 1000 );

  26.         bRet = ESP8266_Cmd ( pStr, "SEND OK", 0, 1000 );
  27.   }

  28.     return bRet;

  29. }


 楼主| dongnanxibei 发表于 2016-9-22 14:07 | 显示全部楼层
8,函数主动接受的函数,这儿是主动接受的数据。
自己调用很好的使用。能达到很不错的效果,下面的函数里面有这个函数的调用的使用。
  1. /*
  2. * 函数名:ESP8266_ReceiveString
  3. * 描述  :WF-ESP8266模块接收字符串
  4. * 输入  :enumEnUnvarnishTx,声明是否已使能了透传模式
  5. * 返回  : 接收到的字符串首地址
  6. * 调用  :被外部调用
  7. */
  8. char * ESP8266_ReceiveString ( FunctionalState enumEnUnvarnishTx )
  9. {
  10.     char * pRecStr = 0;

  11.     strEsp8266_Fram_Record .InfBit .FramLength = 0;
  12.     strEsp8266_Fram_Record .InfBit .FramFinishFlag = 0;
  13.     while ( ! strEsp8266_Fram_Record .InfBit .FramFinishFlag );
  14.     strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ] = '\0';

  15.     if ( enumEnUnvarnishTx )
  16.     {
  17.         if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, ">" ) )
  18.             pRecStr = strEsp8266_Fram_Record .Data_RX_BUF;

  19.     }

  20.     else
  21.     {
  22.         if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+IPD" ) )
  23.             pRecStr = strEsp8266_Fram_Record .Data_RX_BUF;

  24.     }

  25.     return pRecStr;

  26. }

9,,,,,,,,,,,,,,,,,
这是一个最整体的函数,作用是相当于对stm32驱动wifi模块,进行初始化,链接路由器账号,密码,以及端口号的设置。
很重要的一个函数。。。。。。。
  1. /*
  2. * 函数名:ESP8266_STA_TCP_Client
  3. * 描述  :WF-ESP8266模块进行STA TCP Clien测试
  4. * 输入  :无
  5. * 返回  : 无
  6. * 调用  :被外部调用
  7. */
  8. void ESP8266_STA_TCP_Client ( void )
  9. {
  10.     char cStrInput [100] = { 0 }, * pStrDelimiter [2], * pBuf, * pStr;
  11.     u8 uc = 0;
  12.   u32 ul = 0;

  13.     ESP8266_Choose ( ENABLE );  
  14.      // PC_Usart ( "-1-----------------------------sss");
  15.     ESP8266_AT_Test ();

  16.     ESP8266_Net_Mode_Choose ( STA );

  17.     ESP8266_Cmd ( "AT+CWLAP", "OK", 0, 5000 );
  18. ///////////////////////   处  理  登陆密码的操作 ////////////////////////////////////////
  19.     PC_Usart ( "------------------------------sss");
  20.     ESP8266_password_join();

  21. /* do
  22.     {
  23.         PC_Usart ( "\r\n请输入要连接的WiFi名称和密钥,输入格式为:名称字符+英文逗号+密钥字符+空格,点击发送\r\n" );

  24.         scanf ( "%s", cStrInput );

  25.         PC_Usart ( "\r\n稍等片刻 ……\r\n" );

  26.         pBuf = cStrInput;
  27.         uc = 0;
  28.         while ( ( pStr = strtok ( pBuf, "," ) ) != NULL )
  29.         {
  30.             pStrDelimiter [ uc ++ ] = pStr;
  31.             pBuf = NULL;
  32.         }

  33.   } while ( ! ESP8266_JoinAP ( pStrDelimiter [0], pStrDelimiter [1] ) ); */

  34. ///////////////////////////////////////////////////////////////////////////////////////
  35.     ESP8266_Enable_MultipleId ( ENABLE );
  36. ///////////////////////////////处理  tcp 服务连接的函数////////////////////////////////////////////  
  37.     ESP8266_linkTCP_join();


  38.     /*

  39.         选择tcp/udp连接代码,以上修改为固定,在函数ESP8266_linkTCP_join()内。
  40.     do
  41.     {
  42. g       PC_Usart ( "\r\n请在电脑上将网络调试助手以TCP Server连接网络,并输入电脑的IP和端口号,输入格式为:电脑IP+英文逗号+端口号+空格,点击发送\r\n" );

  43.         scanf ( "%s", cStrInput );

  44.         PC_Usart ( "\r\n稍等片刻 ……\r\n" );

  45.         pBuf = cStrInput;
  46.         uc = 0;
  47.         while ( ( pStr = strtok ( pBuf, "," ) ) != NULL )
  48.         {
  49.             pStrDelimiter [ uc ++ ] = pStr;
  50.             pBuf = NULL;
  51.         }

  52.   } while ( ! (  ESP8266_Link_Server ( enumTCP, pStrDelimiter [0], pStrDelimiter [1], Multiple_ID_0 )  ) );

  53.             //   && ESP8266_Link_Server ( enumTCP, pStrDelimiter [0], pStrDelimiter [1], Multiple_ID_1 ) &&
  54.             //  ESP8266_Link_Server ( enumTCP, pStrDelimiter [0], pStrDelimiter [1], Multiple_ID_2 ) &&
  55.            //   ESP8266_Link_Server ( enumTCP, pStrDelimiter [0], pStrDelimiter [1], Multiple_ID_3 ) &&
  56.            //   ESP8266_Link_Server ( enumTCP, pStrDelimiter [0], pStrDelimiter [1], Multiple_ID_4 )
  57.     */        
  58.             GPIO_ResetBits(GPIOC, GPIO_Pin_3);
  59.             Delay_ms(1000);
  60.             linktcp_LED_tell();linktcp_LED_tell();linktcp_LED_tell();
  61.             //LED_all_hei();
  62.             //  GPIO_ResetBits(GPIOC, GPIO_Pin_3);

  63.    /*


  64.    if(usart1_rx_value==1){

  65.         PC_Usart ( "\r\n请输入端口ID%d要发送的字符串,输入格式为:字符串(不含空格)+空格,点击发送\r\n", uc );

  66.         scanf ( "%s", cStrInput );

  67.         ul = strlen ( cStrInput );

  68.         ESP8266_SendString ( DISABLE, cStrInput, ul, ( ENUM_ID_NO_TypeDef ) uc );

  69.         ESP8266_SendString ( DISABLE, cStrInput, ul, ( ENUM_ID_NO_TypeDef ) uc );

  70.    }                    */
  71. //////////////////////////////////////////////////////////////////////////////////////////////////////////  
  72.   for ( uc = 0; uc < 2; uc ++ )
  73.     {
  74.         PC_Usart ( "\r\n请输入端口ID%d要发送的字符串,输入格式为:字符串(不含空格)+空格,点击发送\r\n", uc );

  75.         scanf ( "%s", cStrInput );

  76.         ul = strlen ( cStrInput );

  77.     //  ESP8266_SendString ( DISABLE, cStrInput, ul, ( ENUM_ID_NO_TypeDef ) uc );
  78.         ESP8266_SendString ( DISABLE, cStrInput, ul, ( ENUM_ID_NO_TypeDef ) 0 );

  79.         PC_Usart ( "%s", strEsp8266_Fram_Record .Data_RX_BUF );

  80.     }


  81.     PC_Usart ( "\r\n请在网络调试助手发送字符串\r\n" );
  82.     while (1)
  83.     {
  84.     //////////////////////////////
  85.     //接收电脑端的数据
  86.         pStr = ESP8266_ReceiveString ( DISABLE );
  87.         PC_Usart ( "%s", pStr );
  88.    ///////////////////////////////////
  89.     //发送电脑端的数据
  90.     //  scanf ( "%s", cStrInput );
  91.     //
  92.     //      ul = strlen ( str1_1esp8266.Data_RX_BUF );
  93.     //      
  94.     //      ESP8266_SendString ( DISABLE, str1_1esp8266.Data_RX_BUF, ul, ( ENUM_ID_NO_TypeDef ) 0 );
  95.     //      
  96.     //      PC_Usart ( "%s", str1_1esp8266 .Data_RX_BUF );

  97.         PC_Usart ( "\r\n输入格式为:字符串(不含空格)+空格,点击发送\r\n", uc );
  98.         //
  99.         scanf ( "%s", cStrInput );

  100.         ul = strlen ( cStrInput );

  101.         ESP8266_SendString ( DISABLE, cStrInput, ul, ( ENUM_ID_NO_TypeDef ) 0 );
  102.         PC_Usart ( "%s", strEsp8266_Fram_Record .Data_RX_BUF );




  103.     }

  104. }





 楼主| dongnanxibei 发表于 2016-9-22 14:08 | 显示全部楼层

10,下面是一些相关函数的封装,吧at指令都封装在一起的函数体,不需要的话可以不在自己的函数里面添加。
  1. /*
  2. * 函数名:ESP8266_UnvarnishSend
  3. * 描述  :配置WF-ESP8266模块进入透传发送
  4. * 输入  :无
  5. * 返回  : 1,配置成功              
  6. *         0,配置失败
  7. * 调用  :被外部调用
  8. */
  9. bool ESP8266_UnvarnishSend ( void )
  10. {
  11.     return (
  12.       ESP8266_Cmd ( "AT+CIPMODE=1", "OK", 0, 500 ) &&
  13.       ESP8266_Cmd ( "AT+CIPSEND", "\r\n", ">", 500 ) );

  14. }






  15. /*
  16. * 函数名:ESP8266_StartOrShutServer
  17. * 描述  :WF-ESP8266模块开启或关闭服务器模式
  18. * 输入  :enumMode,开启/关闭
  19. *       :pPortNum,服务器端口号字符串
  20. *       :pTimeOver,服务器超时时间字符串,单位:秒
  21. * 返回  : 1,操作成功
  22. *         0,操作失败
  23. * 调用  :被外部调用
  24. */
  25. bool ESP8266_StartOrShutServer ( FunctionalState enumMode, char * pPortNum, char * pTimeOver )
  26. {
  27.     char cCmd1 [120], cCmd2 [120];

  28.     if ( enumMode )
  29.     {
  30.         sprintf ( cCmd1, "AT+CIPSERVER=%d,%s", 1, pPortNum );

  31.         sprintf ( cCmd2, "AT+CIPSTO=%s", pTimeOver );

  32.         return ( ESP8266_Cmd ( cCmd1, "OK", 0, 500 ) &&
  33.                          ESP8266_Cmd ( cCmd2, "OK", 0, 500 ) );
  34.     }

  35.     else
  36.     {
  37.         sprintf ( cCmd1, "AT+CIPSERVER=%d,%s", 0, pPortNum );

  38.         return ESP8266_Cmd ( cCmd1, "OK", 0, 500 );
  39.     }

  40. }






  41. /*
  42. * 函数名:ESP8266_Link_Server
  43. * 描述  :WF-ESP8266模块连接外部服务器
  44. * 输入  :enumE,网络协议
  45. *       :ip,服务器IP字符串
  46. *       :ComNum,服务器端口字符串
  47. *       :id,模块连接服务器的ID
  48. * 返回  : 1,连接成功
  49. *         0,连接失败
  50. * 调用  :被外部调用
  51. */
  52. bool ESP8266_Link_Server ( ENUM_NetPro_TypeDef enumE, char * ip, char * ComNum, ENUM_ID_NO_TypeDef id)
  53. {
  54.     char cStr [100] = { 0 }, cCmd [120];

  55.   switch (  enumE )
  56.   {
  57.         case enumTCP:
  58.           sprintf ( cStr, ""%s","%s",%s", "TCP", ip, ComNum );
  59.           break;

  60.         case enumUDP:
  61.           sprintf ( cStr, ""%s","%s",%s", "UDP", ip, ComNum );
  62.           break;

  63.         default:
  64.             break;
  65.   }

  66.   if ( id < 5 )
  67.     sprintf ( cCmd, "AT+CIPSTART=%d,%s", id, cStr);

  68.   else
  69.       sprintf ( cCmd, "AT+CIPSTART=%s", cStr );

  70.     return ESP8266_Cmd ( cCmd, "OK", "ALREAY CONNECT", 500 );

  71. }




  72. /*
  73. * 函数名:ESP8266_BuildAP
  74. * 描述  :WF-ESP8266模块创建WiFi热点
  75. * 输入  :pSSID,WiFi名称字符串
  76. *       :pPassWord,WiFi密码字符串
  77. *       :enunPsdMode,WiFi加密方式代号字符串
  78. * 返回  : 1,创建成功
  79. *         0,创建失败
  80. * 调用  :被外部调用
  81. */
  82. bool ESP8266_BuildAP ( char * pSSID, char * pPassWord, char * enunPsdMode )
  83. {
  84.     char cCmd [120];

  85.     sprintf ( cCmd, "AT+CWSAP="%s","%s",1,%s", pSSID, pPassWord, enunPsdMode );

  86.     return ESP8266_Cmd ( cCmd, "OK", 0, 1000 );

  87. }




  88. /*
  89. * 函数名:ESP8266_JoinAP
  90. * 描述  :WF-ESP8266模块连接外部WiFi
  91. * 输入  :pSSID,WiFi名称字符串
  92. *       :pPassWord,WiFi密码字符串
  93. * 返回  : 1,连接成功
  94. *         0,连接失败
  95. * 调用  :被外部调用
  96. */
  97. bool ESP8266_JoinAP ( char * pSSID, char * pPassWord )
  98. {
  99.     char cCmd [120];

  100.     sprintf ( cCmd, "AT+CWJAP="%s","%s"", pSSID, pPassWord );

  101.     return ESP8266_Cmd ( cCmd, "OK", NULL, 7000 );

  102. }




  103. /*
  104. * 函数名:ESP8266_Net_Mode_Choose
  105. * 描述  :选择WF-ESP8266模块的工作模式
  106. * 输入  :enumMode,工作模式
  107. * 返回  : 1,选择成功
  108. *         0,选择失败
  109. * 调用  :被外部调用
  110. */
  111. bool ESP8266_Net_Mode_Choose ( ENUM_Net_ModeTypeDef enumMode )
  112. {
  113.     switch ( enumMode )
  114.     {
  115.         case STA:
  116.             return ESP8266_Cmd ( "AT+CWMODE=1", "OK", "no change", 2500 );

  117.       case AP:
  118.           return ESP8266_Cmd ( "AT+CWMODE=2", "OK", "no change", 2500 );

  119.         case STA_AP:
  120.           return ESP8266_Cmd ( "AT+CWMODE=3", "OK", "no change", 2500 );

  121.       default:
  122.           return false;
  123.   }

  124. }




  125. 对函数进行的时候,可以线在while中调用at测试函数,这样,看看是否成功。
  126. /*
  127. * 函数名:ESP8266_AT_Test
  128. * 描述  :对WF-ESP8266模块进行AT测试启动
  129. * 输入  :无
  130. * 返回  : 无
  131. * 调用  :被外部调用
  132. */
  133. void ESP8266_AT_Test ( void )
  134. {
  135.     ESP8266_RST_HIGH_LEVEL();

  136.     Delay_ms ( 1000 );

  137.     while ( ! ESP8266_Cmd ( "AT", "OK", NULL, 200 ) )   ESP8266_Rst ();     

  138. }





  139. /*
  140. * 函数名:ESP8266_Rst
  141. * 描述  :重启WF-ESP8266模块
  142. * 输入  :无
  143. * 返回  : 无
  144. * 调用  :被ESP8266_AT_Test调用
  145. */
  146. void ESP8266_Rst ( void )
  147. {
  148.     #if 0
  149.      ESP8266_Cmd ( "AT+RST", "OK", "ready", 2500 );     

  150.     #else
  151.      ESP8266_RST_LOW_LEVEL();
  152.      Delay_ms ( 500 );
  153.      ESP8266_RST_HIGH_LEVEL();

  154.     #endif

  155. }



  156. /*
  157. * 函数名:ESP8266_Choose
  158. * 描述  :使能/禁用WF-ESP8266模块
  159. * 输入  :enumChoose = ENABLE,使能模块
  160. *         enumChoose = DISABLE,禁用模块
  161. * 返回  : 无
  162. * 调用  :被外部调用
  163. */
  164. void ESP8266_Choose ( FunctionalState enumChoose )
  165. {
  166.     if ( enumChoose == ENABLE )
  167.         ESP8266_CH_HIGH_LEVEL();

  168.     else
  169.         ESP8266_CH_LOW_LEVEL();

  170. }


 楼主| dongnanxibei 发表于 2016-9-22 14:09 | 显示全部楼层
11,在main函数里面调用,
WiFi_Config();
  1. /**
  2.   * [url=home.php?mod=space&uid=247401]@brief[/url]  WiFi_Config wifi 初始化
  3.   * @param  无
  4.   * @retval 无
  5.   */
  6. void WiFi_Config( void )
  7. {
  8.     WiFi_RST_INIT();
  9.     WiFi_led_INIT();
  10.     WiFi_USART1_INIT();
  11.     WiFi_USART2_INIT();
  12.     WiFi_NVIC_INIT();

  13. }
12,这儿特别注意,因为涉及到串口等模块,所以在STM32f10x_conf.h里面一定要添加自己需要的头文件。
这儿我吧我的所有的都拷贝下来了,读者根据自己的需要自己修改。
  1. /* Includes ------------------------------------------------------------------*/
  2. /* Uncomment/Comment the line below to enable/disable peripheral header file inclusion */
  3. //#include "stm32f10x_adc.h"
  4. //#include "stm32f10x_bkp.h"
  5. //#include "stm32f10x_can.h"
  6. //#include "stm32f10x_cec.h"
  7. //#include "stm32f10x_crc.h"
  8. //#include "stm32f10x_dac.h"
  9. //#include "stm32f10x_dbgmcu.h"
  10. #include "stm32f10x_dma.h"
  11. //#include "stm32f10x_exti.h"
  12. //#include "stm32f10x_flash.h"
  13. #include "stm32f10x_fsmc.h"
  14. #include "stm32f10x_gpio.h"
  15. //#include "stm32f10x_i2c.h"
  16. //#include "stm32f10x_iwdg.h"
  17. //#include "stm32f10x_pwr.h"
  18. #include "stm32f10x_rcc.h"
  19. //#include "stm32f10x_rtc.h"
  20. //#include "stm32f10x_sdio.h"
  21. #include "stm32f10x_spi.h"
  22. #include "stm32f10x_tim.h"
  23. #include "stm32f10x_usart.h"
  24. //#include "stm32f10x_wwdg.h"
  25. #include "misc.h" /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */


 楼主| dongnanxibei 发表于 2016-9-22 14:09 | 显示全部楼层
具体的主函数我就不写了,每个人的需求不一样,很多东西都会不一样的,这儿我写下了大部分通用的,记得当时我学stm32和esp8266的时候,刚好是为了比赛,时间很紧张,信号有51单片机基础,然后之前一直在学c,java,android,java ee,(大学主要时间花在学习java和android上面),一直对软件很感兴趣,所以有编程的基础,所以学习stm32的时候,只花了很短的时间。网卡这块加上整合以前的代码rfid,和其他串口连接zigbee模块,一共花了10天时间。,庆幸与网络下帮助我解决了很多的错误问题,让我没有走太多的弯路,所以,今天分享一下当时我的路线,希望能帮助其他人。

http://download.csdn.net/album/detail/2287
http://download.csdn.net/album/detail/2287
http://download.csdn.net/album/detail/2287
http://download.csdn.net/album/detail/2287
下载地址

http://download.csdn.net/detail/xs15073722800/9187723

http://download.csdn.net/detail/xs15073722800/9187787

http://download.csdn.net/detail/xs15073722800/9187833
等等。。。方便你下载资料。
野火_firege 发表于 2016-9-22 14:51 | 显示全部楼层
帮顶                           ,写的很好
294479435 发表于 2016-9-22 15:56 | 显示全部楼层
楼主很厉害,很实用,感谢
dirtwillfly 发表于 2016-9-22 16:21 | 显示全部楼层
感谢分享。资料建议上传到21ic的下载频道
mmuuss586 发表于 2016-9-22 20:22 | 显示全部楼层
谢谢分享;
wahahaheihei 发表于 2016-9-22 23:36 | 显示全部楼层
直接在结果体中进行取值和判断是否是想要的值
bd7qwmcu 发表于 2016-9-22 23:43 | 显示全部楼层
努力学习下
简单happy 发表于 2016-9-23 07:06 | 显示全部楼层
收藏备用
dianhang 发表于 2016-9-23 11:01 | 显示全部楼层
很有用 谢谢 分享
wangzeping 发表于 2017-3-13 08:28 | 显示全部楼层
您好,我看了你写的STM32驱动ESP8266WiFi模块,写的很好;我在做关于这方面的毕业设计,有些问题想请教您,不知道能不能加个扣扣好友,我的扣扣号:272685893;十分感谢
 楼主| dongnanxibei 发表于 2017-3-13 08:51 | 显示全部楼层
wangzeping 发表于 2017-3-13 08:28
您好,我看了你写的STM32驱动ESP8266WiFi模块,写的很好;我在做关于这方面的毕业设计,有些问题想请教您, ...

我也是菜鸟,看到好的,转来的,我也在学习。
我是想直接用ESP8266,不用那个STM32,用NodeMCU固件。你可以去看看。执行Lua脚本。
 楼主| dongnanxibei 发表于 2017-3-13 08:53 | 显示全部楼层
wangzeping 发表于 2017-3-13 08:28
您好,我看了你写的STM32驱动ESP8266WiFi模块,写的很好;我在做关于这方面的毕业设计,有些问题想请教您, ...

如果你用官方演示用的AT指令固件,那么就要熟悉这些固件,以及网络通信的一些知识。。怎么发送get,post请求。。。怎么操作服务器端。。。
caitao1103 发表于 2017-3-13 15:27 | 显示全部楼层
谢谢楼主分享,mark一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

223

主题

3840

帖子

18

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

223

主题

3840

帖子

18

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