打印
[应用相关]

stm32 WiFi建立tcp连接

[复制链接]
4329|34
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dingbo95|  楼主 | 2018-9-26 21:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
初始化
void WiFi_Config( void )
{
        WiFi_RST_INIT();
  WiFi_USART1_INIT();
        WiFi_USART2_INIT();
        WiFi_NVIC_INIT();

}

沙发
dingbo95|  楼主 | 2018-9-26 21:10 | 只看该作者
/// 配置NVIC中的UART2中断
void NVIC_Configuration( void )
{
        NVIC_InitTypeDef NVIC_InitStructure;
       
        /* Configure the NVIC Preemption Priority Bits */  
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

        /* Enable the USART2 Interrupt */
        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;         
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

}

使用特权

评论回复
板凳
dingbo95|  楼主 | 2018-9-26 21:10 | 只看该作者
/*
* 函数名:ESP8266_Choose
* 描述  :使能/禁用WF-ESP8266模块
* 输入  :enumChoose = ENABLE,使能模块
*         enumChoose = DISABLE,禁用模块
* 返回  : 无
* 调用  :被外部调用
*/
void ESP8266_Choose ( FunctionalState enumChoose )
{
        if ( enumChoose == ENABLE )
                ESP8266_CH_HIGH_LEVEL();
       
        else
                ESP8266_CH_LOW_LEVEL();
       
}

使用特权

评论回复
地板
dingbo95|  楼主 | 2018-9-26 21:11 | 只看该作者
/*
* 函数名:ESP8266_Rst
* 描述  :重启WF-ESP8266模块
* 输入  :无
* 返回  : 无
* 调用  :被ESP8266_AT_Test调用
*/
void ESP8266_Rst ( void )
{
        #if 0
         ESP8266_Cmd ( "AT+RST", "OK", "ready", 2500 );          
       
        #else
         ESP8266_RST_LOW_LEVEL();
         Delay_ms ( 500 );
         ESP8266_RST_HIGH_LEVEL();
         
        #endif

}

使用特权

评论回复
5
dingbo95|  楼主 | 2018-9-26 21:11 | 只看该作者
/*
* 函数名:ESP8266_AT_Test
* 描述  :对WF-ESP8266模块进行AT测试启动
* 输入  :无
* 返回  : 无
* 调用  :被外部调用
*/
void ESP8266_AT_Test ( void )
{
        ESP8266_RST_HIGH_LEVEL();
       
        Delay_ms ( 1000 );
       
        while ( ! ESP8266_Cmd ( "AT", "OK", NULL, 200 ) ) ESP8266_Rst ();         

}

使用特权

评论回复
6
dingbo95|  楼主 | 2018-9-26 21:11 | 只看该作者
/*
* 函数名:ESP8266_Cmd
* 描述  :对WF-ESP8266模块发送AT指令
* 输入  :cmd,待发送的指令
*         reply1,reply2,期待的响应,为NULL表不需响应,两者为或逻辑关系
*         waittime,等待响应的时间
* 返回  : 1,指令发送成功
*         0,指令发送失败
* 调用  :被外部调用
*/
bool ESP8266_Cmd ( char * cmd, char * reply1, char * reply2, u32 waittime )
{   
        strEsp8266_Fram_Record .InfBit .FramLength = 0;               //从新开始接收新的数据包

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

        if ( ( reply1 == 0 ) && ( reply2 == 0 ) )                      //不需要接收数据
                return true;
       
        Delay_ms ( waittime );                 //延时
       
        strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ]  = '\0';

        PC_Usart ( "%s", strEsp8266_Fram_Record .Data_RX_BUF );
  
        if ( ( reply1 != 0 ) && ( reply2 != 0 ) )
                return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply1 ) ||
                                                 ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply2 ) );
       
        else if ( reply1 != 0 )
                return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply1 ) );
       
        else
                return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply2 ) );
       
}

使用特权

评论回复
7
dingbo95|  楼主 | 2018-9-26 21:12 | 只看该作者
/*
* 函数名:ESP8266_Net_Mode_Choose
* 描述  :选择WF-ESP8266模块的工作模式
* 输入  :enumMode,工作模式
* 返回  : 1,选择成功
*         0,选择失败
* 调用  :被外部调用
*/
bool ESP8266_Net_Mode_Choose ( ENUM_Net_ModeTypeDef enumMode )
{
        switch ( enumMode )
        {
                case STA:
                        return ESP8266_Cmd ( "AT+CWMODE=1", "OK", "no change", 2500 );
               
          case AP:
                  return ESP8266_Cmd ( "AT+CWMODE=2", "OK", "no change", 2500 );
               
                case STA_AP:
                  return ESP8266_Cmd ( "AT+CWMODE=3", "OK", "no change", 2500 );
               
          default:
                  return false;
  }
       
}

使用特权

评论回复
8
dingbo95|  楼主 | 2018-9-26 21:12 | 只看该作者
/*
* 函数名:ESP8266_JoinAP
* 描述  :WF-ESP8266模块连接外部WiFi
* 输入  :pSSID,WiFi名称字符串
*       :pPassWord,WiFi密码字符串
* 返回  : 1,连接成功
*         0,连接失败
* 调用  :被外部调用
*/
bool ESP8266_JoinAP ( char * pSSID, char * pPassWord )
{
        char cCmd [120];

        sprintf ( cCmd, "AT+CWJAP=\"%s\",\"%s\"", pSSID, pPassWord );
       
        return ESP8266_Cmd ( cCmd, "OK", NULL, 7000 );
       
}

使用特权

评论回复
9
dingbo95|  楼主 | 2018-9-26 21:12 | 只看该作者
/*
* 函数名:ESP8266_BuildAP
* 描述  :WF-ESP8266模块创建WiFi热点
* 输入  :pSSID,WiFi名称字符串
*       :pPassWord,WiFi密码字符串
*       :enunPsdMode,WiFi加密方式代号字符串
* 返回  : 1,创建成功
*         0,创建失败
* 调用  :被外部调用
*/
bool ESP8266_BuildAP ( char * pSSID, char * pPassWord, char * enunPsdMode )
{
        char cCmd [120];

        sprintf ( cCmd, "AT+CWSAP=\"%s\",\"%s\",1,%s", pSSID, pPassWord, enunPsdMode );
       
        return ESP8266_Cmd ( cCmd, "OK", 0, 1000 );
       
}

使用特权

评论回复
10
dingbo95|  楼主 | 2018-9-26 21:13 | 只看该作者
/*
* 函数名:ESP8266_Enable_MultipleId
* 描述  :WF-ESP8266模块启动多连接
* 输入  :enumEnUnvarnishTx,配置是否多连接
* 返回  : 1,配置成功
*         0,配置失败
* 调用  :被外部调用
*/
bool ESP8266_Enable_MultipleId ( FunctionalState enumEnUnvarnishTx )
{
        char cStr [20];
       
        sprintf ( cStr, "AT+CIPMUX=%d", ( enumEnUnvarnishTx ? 1 : 0 ) );
       
        return ESP8266_Cmd ( cStr, "OK", 0, 500 );
       
}

使用特权

评论回复
11
dingbo95|  楼主 | 2018-9-26 21:13 | 只看该作者
/*
* 函数名:ESP8266_Link_Server
* 描述  :WF-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_Cmd ( cCmd, "OK", "ALREAY CONNECT", 500 );
       
}

使用特权

评论回复
12
dingbo95|  楼主 | 2018-9-26 21:14 | 只看该作者
/*
* 函数名:ESP8266_StartOrShutServer
* 描述  :WF-ESP8266模块开启或关闭服务器模式
* 输入  :enumMode,开启/关闭
*       :pPortNum,服务器端口号字符串
*       :pTimeOver,服务器超时时间字符串,单位:秒
* 返回  : 1,操作成功
*         0,操作失败
* 调用  :被外部调用
*/
bool ESP8266_StartOrShutServer ( FunctionalState enumMode, char * pPortNum, char * pTimeOver )
{
        char cCmd1 [120], cCmd2 [120];

        if ( enumMode )
        {
                sprintf ( cCmd1, "AT+CIPSERVER=%d,%s", 1, pPortNum );
               
                sprintf ( cCmd2, "AT+CIPSTO=%s", pTimeOver );

                return ( ESP8266_Cmd ( cCmd1, "OK", 0, 500 ) &&
                                                 ESP8266_Cmd ( cCmd2, "OK", 0, 500 ) );
        }
       
        else
        {
                sprintf ( cCmd1, "AT+CIPSERVER=%d,%s", 0, pPortNum );

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

使用特权

评论回复
13
dingbo95|  楼主 | 2018-9-26 21:15 | 只看该作者
/*
* 函数名:ESP8266_UnvarnishSend
* 描述  :配置WF-ESP8266模块进入透传发送
* 输入  :无
* 返回  : 1,配置成功
*         0,配置失败
* 调用  :被外部调用
*/
bool ESP8266_UnvarnishSend ( void )
{
        return (
          ESP8266_Cmd ( "AT+CIPMODE=1", "OK", 0, 500 ) &&
          ESP8266_Cmd ( "AT+CIPSEND", "\r\n", ">", 500 ) );
       
}

使用特权

评论回复
14
dingbo95|  楼主 | 2018-9-26 21:15 | 只看该作者
/*
* 函数名:ESP8266_SendString
* 描述  :WF-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 );

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

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

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

}

使用特权

评论回复
15
dingbo95|  楼主 | 2018-9-26 21:15 | 只看该作者
/*
* 函数名:ESP8266_ReceiveString
* 描述  :WF-ESP8266模块接收字符串
* 输入  :enumEnUnvarnishTx,声明是否已使能了透传模式
* 返回  : 接收到的字符串首地址
* 调用  :被外部调用
*/
char * ESP8266_ReceiveString ( FunctionalState enumEnUnvarnishTx )
{
        char * pRecStr = 0;
       
        strEsp8266_Fram_Record .InfBit .FramLength = 0;
        strEsp8266_Fram_Record .InfBit .FramFinishFlag = 0;
        while ( ! strEsp8266_Fram_Record .InfBit .FramFinishFlag );
        strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ] = '\0';
       
        if ( enumEnUnvarnishTx )
        {
                if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, ">" ) )
                        pRecStr = strEsp8266_Fram_Record .Data_RX_BUF;

        }
       
        else
        {
                if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+IPD" ) )
                        pRecStr = strEsp8266_Fram_Record .Data_RX_BUF;

        }

        return pRecStr;
       
}

使用特权

评论回复
16
dingbo95|  楼主 | 2018-9-26 21:16 | 只看该作者
/*
* 函数名:ESP8266_STA_TCP_Client
* 描述  :WF-ESP8266模块进行STA TCP Clien测试
* 输入  :无
* 返回  : 无
* 调用  :被外部调用
*/
void ESP8266_STA_TCP_Client ( void )
{
        char cStrInput [100] = { 0 }, * pStrDelimiter [2], * pBuf, * pStr;
        u8 uc = 0;
  u32 ul = 0;

        ESP8266_Choose ( ENABLE );       

        ESP8266_AT_Test ();
       
        ESP8266_Net_Mode_Choose ( STA );
  
        ESP8266_Cmd ( "AT+CWLAP", "OK", 0, 5000 );
               
  do
        {
                PC_Usart ( "\r\n请输入要连接的WiFi名称和密钥,输入格式为:名称字符+英文逗号+密钥字符+空格,点击发送\r\n" );

                scanf ( "%s", cStrInput );

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

                pBuf = cStrInput;
                uc = 0;
                while ( ( pStr = strtok ( pBuf, "," ) ) != NULL )
                {
                        pStrDelimiter [ uc ++ ] = pStr;
                        pBuf = NULL;
                }
               
  } while ( ! ESP8266_JoinAP ( pStrDelimiter [0], pStrDelimiter [1] ) );
       
        ESP8266_Enable_MultipleId ( ENABLE );
       
        do
        {
                PC_Usart ( "\r\n请在电脑上将网络调试助手以TCP Server连接网络,并输入电脑的IP和端口号,输入格式为:电脑IP+英文逗号+端口号+空格,点击发送\r\n" );

                scanf ( "%s", cStrInput );

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

                pBuf = cStrInput;
                uc = 0;
                while ( ( pStr = strtok ( pBuf, "," ) ) != NULL )
                {
                        pStrDelimiter [ uc ++ ] = pStr;
                        pBuf = NULL;
                }
               
  } while ( ! ( ESP8266_Link_Server ( enumTCP, pStrDelimiter [0], pStrDelimiter [1], Multiple_ID_0 ) &&
                      ESP8266_Link_Server ( enumTCP, pStrDelimiter [0], pStrDelimiter [1], Multiple_ID_1 ) &&
                      ESP8266_Link_Server ( enumTCP, pStrDelimiter [0], pStrDelimiter [1], Multiple_ID_2 ) &&
                      ESP8266_Link_Server ( enumTCP, pStrDelimiter [0], pStrDelimiter [1], Multiple_ID_3 ) &&
                      ESP8266_Link_Server ( enumTCP, pStrDelimiter [0], pStrDelimiter [1], Multiple_ID_4 ) ) );

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

                scanf ( "%s", cStrInput );

                ul = strlen ( cStrInput );
               
                ESP8266_SendString ( DISABLE, cStrInput, ul, ( ENUM_ID_NO_TypeDef ) uc );
               
        }
       
       
        PC_Usart ( "\r\n请在网络调试助手发送字符串\r\n" );
        while (1)
        {
          pStr = ESP8266_ReceiveString ( DISABLE );
                PC_Usart ( "%s", pStr );
        }

}

使用特权

评论回复
17
dingbo95|  楼主 | 2018-9-26 21:16 | 只看该作者
/*
* 函数名:ESP8266_AP_TCP_Server
* 描述  :WF-ESP8266模块进行AP TCP Server测试
* 输入  :无
* 返回  : 无
* 调用  :被外部调用
*/
void ESP8266_AP_TCP_Server ( void )
{
        char cStrInput [100] = { 0 }, * pStrDelimiter [3], * pBuf, * pStr;
        u8 uc = 0;
  u32 ul = 0;

  ESP8266_Choose ( ENABLE );

        ESP8266_AT_Test ();
       
        ESP8266_Net_Mode_Choose ( AP );


        PC_Usart ( "\r\n请输入要创建的WiFi的名称、加密方式和密钥,加密方式的编号为:\
              \r\n0 = OPEN\
              \r\n1 = WEP\
              \r\n2 = WPA_PSK\
                    \r\n3 = WPA2_PSK\
              \r\n4 = WPA_WPA2_PSK\
                                                        \r\n输入格式为:名称字符+英文逗号+加密方式编号+英文逗号+密钥字符+空格,点击发送\r\n" );

        scanf ( "%s", cStrInput );

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

        pBuf = cStrInput;
        uc = 0;
        while ( ( pStr = strtok ( pBuf, "," ) ) != NULL )
        {
                pStrDelimiter [ uc ++ ] = pStr;
                pBuf = NULL;
        }
       
        ESP8266_BuildAP ( pStrDelimiter [0], pStrDelimiter [2], pStrDelimiter [1] );
        ESP8266_Cmd ( "AT+RST", "OK", "ready", 2500 ); //*
               

        ESP8266_Enable_MultipleId ( ENABLE );
               
       
        PC_Usart ( "\r\n请输入服务器要开启的端口号和超时时间(0~28800,单位:秒),输入格式为:端口号字符+英文逗号+超时时间字符+空格,点击发送\r\n" );

        scanf ( "%s", cStrInput );

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

        pBuf = cStrInput;
        uc = 0;
        while ( ( pStr = strtok ( pBuf, "," ) ) != NULL )
        {
                pStrDelimiter [ uc ++ ] = pStr;
                pBuf = NULL;
        }

        ESP8266_StartOrShutServer ( ENABLE, pStrDelimiter [0], pStrDelimiter [1] );
       
       
        do
        {
                PC_Usart ( "\r\n正查询本模块IP……\r\n" );
          ESP8266_Cmd ( "AT+CIFSR", "OK", "Link", 500 );
               
                PC_Usart ( "\r\n请用手机连接刚才创建的WiFi,这里只连接一个手机,作为ID0,然后用手机网络调试助手以TCP Client连接刚才开启的服务器(AP IP)……\r\n" );
                Delay_ms ( 20000 ) ;
        }        while ( ! ESP8266_Cmd ( "AT+CIPSTATUS", "+CIPSTATUS:0", 0, 500 ) );
       

        PC_Usart ( "\r\n请输入要向端口手机(ID0)发送的字符串,输入格式为:字符串(不含空格)+空格,点击发送\r\n" );

        scanf ( "%s", cStrInput );

        ul = strlen ( cStrInput );
       
        ESP8266_SendString ( DISABLE, cStrInput, ul, Multiple_ID_0 );

       
        PC_Usart ( "\r\n请在手机网络调试助手发送字符串\r\n" );
        while (1)
        {
          pStr = ESP8266_ReceiveString ( DISABLE );
                PC_Usart ( "%s", pStr );
        }

}

使用特权

评论回复
18
dingbo95|  楼主 | 2018-9-26 21:17 | 只看该作者
/*
* 函数名:ESP8266_StaTcpClient_ApTcpServer
* 描述  :WF-ESP8266模块进行STA(TCP Client)+AP(TCP Server)测试
* 输入  :无
* 返回  : 无
* 调用  :被外部调用
*/
void ESP8266_StaTcpClient_ApTcpServer ( void )
{
        char cStrInput [100] = { 0 }, * pStrDelimiter [3], * pBuf, * pStr;
        u8 uc = 0;
  u32 ul = 0;

  ESP8266_Choose ( ENABLE );

        ESP8266_AT_Test ();
       
        ESP8266_Net_Mode_Choose ( STA_AP );


        PC_Usart ( "\r\n请输入要创建的WiFi的名称、加密方式和密钥,加密方式的编号为:\
                                                \r\n0 = OPEN\
                                                \r\n1  =WEP\
                                                \r\n2 = WPA_PSK\
                                                \r\n3 = WPA2_PSK\
                                                \r\n4 = WPA_WPA2_PSK\
                                                \r\n输入格式为:名称字符+英文逗号+加密方式编号+英文逗号+密钥字符+空格,点击发送\r\n" );

        scanf ( "%s", cStrInput );

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

        pBuf = cStrInput;
        uc = 0;
        while ( ( pStr = strtok ( pBuf, "," ) ) != NULL )
        {
                pStrDelimiter [ uc ++ ] = pStr;
                pBuf = NULL;
        }
       
        ESP8266_BuildAP ( pStrDelimiter [0], pStrDelimiter [2], pStrDelimiter [1] );
        ESP8266_Cmd ( "AT+RST", "OK", "ready", 2500 ); //*
       

        ESP8266_Cmd ( "AT+CWLAP", "OK", 0, 5000 );
               
  do
        {
                PC_Usart ( "\r\n请输入要连接的WiFi名称和密钥,输入格式为:名称字符+英文逗号+密钥字符+空格,点击发送\r\n" );

                scanf ( "%s", cStrInput );

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

                pBuf = cStrInput;
                uc = 0;
                while ( ( pStr = strtok ( pBuf, "," ) ) != NULL )
                {
                        pStrDelimiter [ uc ++ ] = pStr;
                        pBuf = NULL;
                }
               
  } while ( ! ESP8266_JoinAP ( pStrDelimiter [0], pStrDelimiter [1] ) );

       
        ESP8266_Enable_MultipleId ( ENABLE );
               
       
        PC_Usart ( "\r\n请输入服务器要开启的端口号和超时时间(0~28800,单位:秒),输入格式为:端口号字符+英文逗号+超时时间字符+空格,点击发送\r\n" );

        scanf ( "%s", cStrInput );

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

        pBuf = cStrInput;
        uc = 0;
        while ( ( pStr = strtok ( pBuf, "," ) ) != NULL )
        {
                pStrDelimiter [ uc ++ ] = pStr;
                pBuf = NULL;
        }

        ESP8266_StartOrShutServer ( ENABLE, pStrDelimiter [0], pStrDelimiter [1] );
       
       
        do
        {
                PC_Usart ( "\r\n请在电脑上将网络调试助手以TCP Server连接网络,并输入电脑的IP和端口号,输入格式为:电脑IP+英文逗号+端口号+空格,点击发送\r\n" );

                scanf ( "%s", cStrInput );

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

                pBuf = cStrInput;
                uc = 0;
                while ( ( pStr = strtok ( pBuf, "," ) ) != NULL )
                {
                        pStrDelimiter [ uc ++ ] = pStr;
                        pBuf = NULL;
                }
               
  } while ( ! ( ESP8266_Link_Server ( enumTCP, pStrDelimiter [0], pStrDelimiter [1], Multiple_ID_0 ) &&
                      ESP8266_Link_Server ( enumTCP, pStrDelimiter [0], pStrDelimiter [1], Multiple_ID_1 ) &&
                      ESP8266_Link_Server ( enumTCP, pStrDelimiter [0], pStrDelimiter [1], Multiple_ID_2 ) ) );
               
       
        do
        {
                PC_Usart ( "\r\n正查询本模块IP,前一个为AP IP,后一个为STA IP……\r\n" );
          ESP8266_Cmd ( "AT+CIFSR", "OK", "Link", 500 );
               
                PC_Usart ( "\r\n请用手机连接刚才创建的WiFi,这里只连接一个手机,作为ID3,然后用手机网络调试助手以TCP Client连接刚才开启的服务器(AP IP)……\r\n" );
                Delay_ms ( 20000 ) ;
        }        while ( ! ESP8266_Cmd ( "AT+CIPSTATUS", "+CIPSTATUS:3", 0, 500 ) );
       

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

                scanf ( "%s", cStrInput );

                ul = strlen ( cStrInput );
               
                ESP8266_SendString ( DISABLE, cStrInput, ul, ( ENUM_ID_NO_TypeDef ) uc );
               
        }
       
       
        PC_Usart ( "\r\n请输入要向端口手机(ID3)发送的字符串,输入格式为:字符串(不含空格)+空格,点击发送\r\n" );

        scanf ( "%s", cStrInput );

        ul = strlen ( cStrInput );
       
        ESP8266_SendString ( DISABLE, cStrInput, ul, Multiple_ID_3 );

       
        PC_Usart ( "\r\n请在电脑网络调试助手或手机网络调试助手发送字符串……\r\n" );
        while (1)
        {
          pStr = ESP8266_ReceiveString ( DISABLE );
                PC_Usart ( "%s", pStr );
        }
       
}

使用特权

评论回复
19
dingbo95|  楼主 | 2018-9-26 21:23 | 只看该作者
/*
* 函数名:USART2_Config
* 描述  :USART2 GPIO 配置,工作模式配置
* 输入  :无
* 输出  : 无
* 调用  :外部调用
*/
void USART2_Config( void )
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;

        /* config USART2 clock */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

        /* USART2 GPIO config */
  /* Configure USART2 Tx (PA.02) as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
            
  /* Configure USART2 Rx (PA.03) as input floating */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
          
        /* USART2 mode config */
        USART_InitStructure.USART_BaudRate = 9600;               
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No ;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        USART_Init(USART2, &USART_InitStructure);

        /* 使能串口2接收中断 */
        USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
        /* 使能串口2总线空闲中断 */
        USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);
       
        USART_Cmd(USART2, ENABLE);
       
}

使用特权

评论回复
20
dingbo95|  楼主 | 2018-9-26 21:23 | 只看该作者
/*
* 函数名:itoa
* 描述  :将整形数据转换成字符串
* 输入  :-radix =10 表示10进制,其他结果为0
*         -value 要转换的整形数
*         -buf 转换后的字符串
*         -radix = 10
* 输出  :无
* 返回  :无
* 调用  :被USART2_printf()调用
*/
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 */

使用特权

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

本版积分规则

52

主题

1197

帖子

5

粉丝