发新帖我要提问
12
返回列表
打印
[STM32L4]

ESP8266-WIFI模块应用

[复制链接]
楼主: gaoke231
手机看帖
扫描二维码
随时随地手机跟帖
21
gaoke231|  楼主 | 2017-10-31 21:12 | 只看该作者 回帖奖励 |倒序浏览
ESP8266模块连接外部服务器
enumE:网络协议
ip:服务器IP字符串
ComNum:服务器端口字符串
id:模块连接服务器的ID
返回1:连接成功 0:连接失败
bool ESP8266_Link_Server(ENUM_NetPro_TypeDef enumE, char * ip, char * ComNum, ENUM_ID_NO_TypeDef id)
{
        char cStr [100] = { 0 }, cCmd [120];


          switch (  enumE )
          {
                case enumTCP:
                  sprintf ( cStr, "\"%s\",\"%s\",%s", "TCP", ip, ComNum );
                  break;
               
                case enumUDP:
                  sprintf ( cStr, "\"%s\",\"%s\",%s", "UDP", ip, ComNum );
                  break;
               
                default:
                        break;
          }


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


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


        return ESP8266_Send_AT_Cmd ( cCmd, "OK", "ALREAY CONNECT", 4000 );
       
}


使用特权

评论回复
22
gaoke231|  楼主 | 2017-10-31 21:12 | 只看该作者
配置ESP8266模块进入透传发送
返回1:配置成功 0:配置失败
bool ESP8266_UnvarnishSend ( void )
{
        if (!ESP8266_Send_AT_Cmd ( "AT+CIPMODE=1", "OK", 0, 500 ))
                return false;
       
        return
                  ESP8266_Send_AT_Cmd( "AT+CIPSEND", "OK", ">", 500 );
       
}

使用特权

评论回复
23
gaoke231|  楼主 | 2017-10-31 21:13 | 只看该作者
ESP8266模块发送字符串
enumEnUnvarnishTx:声明是否已使能了透传模式
pStr:要发送的字符串
ulStrLength:要发送的字符串的字节数
ucId:哪个ID发送的字符串
返回1:发送成功 0:发送失败
bool ESP8266_SendString(FunctionalState enumEnUnvarnishTx, char * pStr, u32 ulStrLength, ENUM_ID_NO_TypeDef ucId )
{
        char cStr [20];
        bool bRet = false;
       
               
        if ( enumEnUnvarnishTx )
        {
                ESP8266_USART ( "%s", pStr );
               
                bRet = true;
               
        }


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


                else
                        sprintf ( cStr, "AT+CIPSEND=%d", ulStrLength + 2 );
               
                ESP8266_Send_AT_Cmd ( cStr, "> ", 0, 1000 );


                bRet = ESP8266_Send_AT_Cmd ( pStr, "SEND OK", 0, 1000 );
  }
       
        return bRet;


}


使用特权

评论回复
24
gaoke231|  楼主 | 2017-10-31 21:14 | 只看该作者
ESP8266模块退出透传模式
void ESP8266_ExitUnvarnishSend ( void )
{
        delay_ms(1000);
        ESP8266_USART( "+++" );
        delay_ms( 500 );        
}


使用特权

评论回复
25
gaoke231|  楼主 | 2017-10-31 21:15 | 只看该作者
ESP8266 的连接状态,较适合单端口时使用
返回0:获取状态失败
返回2:获得ip
返回3:建立连接
返回4:失去连接
u8 ESP8266_Get_LinkStatus ( void )
{
        if (ESP8266_Send_AT_Cmd( "AT+CIPSTATUS", "OK", 0, 500 ) )
        {
                if ( strstr ( ESP8266_Fram_Record_Struct .Data_RX_BUF, "STATUS:2\r\n" ) )
                        return 2;
               
                else if ( strstr ( ESP8266_Fram_Record_Struct .Data_RX_BUF, "STATUS:3\r\n" ) )
                        return 3;
               
                else if ( strstr ( ESP8266_Fram_Record_Struct .Data_RX_BUF, "STATUS:4\r\n" ) )
                        return 4;               


        }
       
        return 0;
       
}

使用特权

评论回复
26
hanzhen654| | 2017-10-31 21:16 | 只看该作者
感谢分享,8266用的还是很多的。

使用特权

评论回复
27
dingbo95| | 2017-10-31 21:22 | 只看该作者
感谢分享,学习了。

使用特权

评论回复
28
chenqiang10| | 2017-10-31 21:41 | 只看该作者
gaoke231 发表于 2017-10-31 20:57
ESP8266初始化
void ESP8266_Init(u32 bound)
{

这个配置可以提供下原理图吗?

使用特权

评论回复
29
chenqiang10| | 2017-10-31 21:41 | 只看该作者
gaoke231 发表于 2017-10-31 21:00
对ESP8266模块发送AT指令
bool ESP8266_Send_AT_Cmd(char *cmd,char *ack1,char *ack2,u32 time)
{

AT指令还是很简单的。

使用特权

评论回复
30
gaoke231|  楼主 | 2017-11-1 22:47 | 只看该作者
chenqiang10 发表于 2017-10-31 21:41
AT指令还是很简单的。

相互学习,的确AT指令很简单。

使用特权

评论回复
31
gaoke231|  楼主 | 2017-11-2 12:08 | 只看该作者
static char *itoa( int value, char *string, int radix )
{
        int     i, d;
        int     flag = 0;
        char    *ptr = string;

        /* This implementation only works for decimal numbers. */
        if (radix != 10)
        {
                *ptr = 0;
                return string;
        }

        if (!value)
        {
                *ptr++ = 0x30;
                *ptr = 0;
                return string;
        }

        /* if this is a negative value insert the minus sign. */
        if (value < 0)
        {
                *ptr++ = '-';

                /* Make the value positive. */
                value *= -1;
               
        }

        for (i = 10000; i > 0; i /= 10)
        {
                d = value / i;

                if (d || flag)
                {
                        *ptr++ = (char)(d + 0x30);
                        value -= (d * i);
                        flag = 1;
                }
        }

        /* Null terminate the string. */
        *ptr = 0;

        return string;

} /* NCL_Itoa */

使用特权

评论回复
32
gaoke231|  楼主 | 2017-11-2 12:11 | 只看该作者
void USART_printf ( USART_TypeDef * USARTx, char * Data, ... )
{
        const char *s;
        int d;   
        char buf[16];

       
        va_list ap;
        va_start(ap, Data);

        while ( * Data != 0 )     // 判断是否到达字符串结束符
        {                                                          
                if ( * Data == 0x5c )  //'\'
                {                                                                          
                        switch ( *++Data )
                        {
                                case 'r':                                                                  //回车符
                                USART_SendData(USARTx, 0x0d);
                                Data ++;
                                break;

                                case 'n':                                                                  //换行符
                                USART_SendData(USARTx, 0x0a);       
                                Data ++;
                                break;

                                default:
                                Data ++;
                                break;
                        }                         
                }
               
                else if ( * Data == '%')
                {                                                                          //
                        switch ( *++Data )
                        {                               
                                case 's':                                                                                  //字符串
                                s = va_arg(ap, const char *);
                               
                                for ( ; *s; s++)
                                {
                                        USART_SendData(USARTx,*s);
                                        while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );
                                }
                               
                                Data++;
                               
                                break;

                                case 'd':                       
                                        //十进制
                                d = va_arg(ap, int);
                               
                                itoa(d, buf, 10);
                               
                                for (s = buf; *s; s++)
                                {
                                        USART_SendData(USARTx,*s);
                                        while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );
                                }
                               
                                Data++;
                               
                                break;
                               
                                default:
                                Data++;
                               
                                break;
                               
                        }                 
                }
               
                else USART_SendData(USARTx, *Data++);
               
                while ( USART_GetFlagStatus ( USARTx, USART_FLAG_TXE ) == RESET );
               
        }
}


使用特权

评论回复
33
gaoke231|  楼主 | 2017-11-2 12:11 | 只看该作者
void ESP8266_STA_TCPClient_Test(void)
{
        u8 res;
       
        char str[100]={0};
       
        printf ( "\r\n正在配置ESP8266请耐心等待...\r\n" );

        ESP8266_CH_PD_Pin_SetH;

        ESP8266_AT_Test();
        ESP8266_Net_Mode_Choose(STA);
        while(!ESP8266_JoinAP(User_ESP8266_SSID, User_ESP8266_PWD));
        ESP8266_Enable_MultipleId ( DISABLE );
        while(!ESP8266_Link_Server(enumTCP, User_ESP8266_TCPServer_IP, User_ESP8266_TCPServer_PORT, Single_ID_0));
       
        while(!ESP8266_UnvarnishSend());
        printf ( "\r\n配置ESP8266 OK!\r\n" );
       
        while ( 1 )
        {               
                sprintf (str,"www.prechin.cn\r\n" );
                ESP8266_SendString ( ENABLE, str, 0, Single_ID_0 );
                delay_ms(1000);
                if(TcpClosedFlag) //检测是否失去连接
                {
                        ESP8266_ExitUnvarnishSend(); //退出透传模式
                        do
                        {
                                res = ESP8266_Get_LinkStatus();     //获取连接状态
                        }        
                        while(!res);
                       
                        if(res == 4)                     //确认失去连接后重连
                        {
                                printf ( "\r\n请稍等,正在重连热点和服务器...\r\n" );
                               
                                while (!ESP8266_JoinAP(User_ESP8266_SSID, User_ESP8266_PWD ) );
                               
                                while (!ESP8266_Link_Server(enumTCP, User_ESP8266_TCPServer_IP, User_ESP8266_TCPServer_PORT, Single_ID_0 ) );
                               
                                printf ( "\r\n重连热点和服务器成功\r\n" );
                        }
                        while(!ESP8266_UnvarnishSend());                                       
                }
        }
               
}

使用特权

评论回复
34
gaoke231|  楼主 | 2017-11-2 12:12 | 只看该作者
初始化FLASH的IO和SPI
uint16_t FLASH_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOG, ENABLE);
       
        /* SD_CS PG14/ FLASH_CS PG13 */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_Init(GPIOG, &GPIO_InitStructure);
        GPIO_SetBits(GPIOG, GPIO_Pin_14 | GPIO_Pin_13);
       
        /* ENC28J60_CS PB12 */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_SetBits(GPIOB, GPIO_Pin_12);

    /* 初始化SPI2 */
    SPI2_Init();

    /* 初始化FLASH要读取芯片ID一下 */
        return(FLASH_ReadID());   
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则