你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

請問 ESP8266 , ESP8266_ReceiveString()在 main 裡 , 無法正常收data?

[复制链接]
jeffhe1 提问时间:2018-11-5 18:07 /
我是使用霸道者 STM32F103ZET6 , 火哥的 wifi 透傳 demo code 修改, esp8266 當 STA , PC 當 server , PC送 data 給 ESP8266 接收,
但在 main() 調用 ESP8266_ReceiveString() ,無法正常接收資料 , 但在 ESP8266_ReceiveString() , 可以看到正常收到的 data  , 不知道有哪位大神 可以幫忙解答一下 , 真的跪求 ,感恩不盡 > . < !


char *test;


test = ESP8266_ReceiveString(0);


   macPC_Usart ( "test=%s\n", test );





main()

main()

ESP8266_ReceiveString()

ESP8266_ReceiveString()
收藏 评论15 发布时间:2018-11-5 18:07

举报

15个回答
踏平幼稚园 回答时间:2018-11-6 09:37:00
pRecStr赋值判断是不是写错了,函数里走的是else分支但其中没有对pRecStr幅值,main函数里返回的是空指针







jeffhe1 回答时间:2018-11-6 09:55:55
本帖最后由 jeffhe1 于 2018-11-6 09:57 编辑
踏平幼稚园 发表于 2018-11-6 09:37
pRecStr赋值判断是不是写错了,函数里走的是else分支但其中没有对pRecStr幅值,main函数里返回的是空指针

...

那個是由 server 發 data 給 esp8266 wifi module, 再給 STM32 uart , 根據模式 ,放進 strEsp8266_Fram_Record .Data_RX_BUF , 然後再指定 給 pRecStr  (pRecStr = strEsp8266_Fram_Record .Data_RX_BUF;)
應該沒有錯且再函式裡 , data 都可正確打印出來
踏平幼稚园 回答时间:2018-11-6 18:13:26
本帖最后由 踏平幼稚园 于 2018-11-6 18:17 编辑
jeffhe1 发表于 2018-11-6 09:55
那個是由 server 發 data 給 esp8266 wifi module, 再給 STM32 uart , 根據模式 ,放進 strEsp8266_Fram_Re ...

第一张图   pRecStr = strEsp8266_Fram_Record .Data_RX_BUF是 if 判断为真才会执行,之所以第一张图能显示串口信息是走了else分支。

楼主自己看看第一张图里的代码
{
    char* pRecStr  = 0;
    if(真)
    {
        //程序根本没走到这
        pRecStr = strEsp8266_Fram_Record .Data_RX_BUF;
    }
    else
    {
        //程序走的这里
        print("...");  //所以这里调用print能打印
    }
    return pRecStr; //由于if为假,pRecStr没有赋值还是NULL;
}


你试试把上面的"return pRecStr;"改成"return strEsp8266_Fram_Record .Data_RX_BUF;",main函数里肯定能打印









评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

jeffhe1 回答时间:2018-11-7 08:42:48
踏平幼稚园 发表于 2018-11-6 18:13
第一张图   pRecStr = strEsp8266_Fram_Record .Data_RX_BUF是 if 判断为真才会执行,之所以第一张图能显 ...

樓友抱歉 , 你看到的是我 debug 時 , 故意 mark 掉的 , 實際函式如下 , 無論 if () 是或否 , 都會有值填入 pRecStr , 只是在 main () 裡呼叫 , 就不會有正確的 data

/*
* 函数名: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 )
                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;
       
}
轩辕紫木 回答时间:2018-11-7 09:22:36
这个数应该是通过串口中断接受的,先看看串口有没有收到数据

评分

参与人数 1蝴蝶豆 +1 收起 理由
STMCU + 1

查看全部评分

jeffhe1 回答时间:2018-11-7 09:26:14
hu9977 发表于 2018-11-7 09:22
这个数应该是通过串口中断接受的,先看看串口有没有收到数据

有的, 我在函式裡 , 是可以打印出正確的 data
轩辕紫木 回答时间:2018-11-7 09:38:37
jeffhe1 发表于 2018-11-7 09:26
有的, 我在函式裡 , 是可以打印出正確的 data

那应该问题不大。仔细检查打印是否执行,打印的buf是否有数据

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

踏平幼稚园 回答时间:2018-11-7 09:51:05
jeffhe1 发表于 2018-11-7 08:42
樓友抱歉 , 你看到的是我 debug 時 , 故意 mark 掉的 , 實際函式如下 , 無論 if () 是或否 , 都會有值 ...

if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+IPD" ) )
还是判断啊,判断逻辑假,依然不会赋值。建议楼主编译选项设置成none,然后下断点看看pRecStr赋值有没有走到吧。
jeffhe1 回答时间:2018-11-7 11:21:52
hu9977 发表于 2018-11-7 09:38
那应该问题不大。仔细检查打印是否执行,打印的buf是否有数据

函式裡有打印出來正確值 , 到main() 裡 打印出來是亂碼
jeffhe1 回答时间:2018-11-7 11:24:40
踏平幼稚园 发表于 2018-11-7 09:51
if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+IPD" ) )
还是判断啊,判断逻辑假,依然不会赋 ...

是假的話 , 不是透傳模式 , 走 TCP/IP  protcol , 封包裡會有標檔頭 " +IPD " , 我在這裡有打印出來正確的 data
轩辕紫木 回答时间:2018-11-7 14:55:51
jeffhe1 发表于 2018-11-7 11:21
函式裡有打印出來正確值 , 到main() 裡 打印出來是亂碼

你把关键地方的函数代码贴出来,你的截图,看不清楚
jeffhe1 回答时间:2018-11-7 19:44:56
hu9977 发表于 2018-11-7 14:55
你把关键地方的函数代码贴出来,你的截图,看不清楚

/*
* 函数名:ESP8266_ReceiveString
* 描述  :WF-ESP8266模块接收字符串
* 输入  :enumEnUnvarnishTx,声明是否已使能了透传模式
* 返回  : 接收到的字符串首地址
* 调用  :被外部调用
*/
char * ESP8266_ReceiveString ( FunctionalState enumEnUnvarnishTx )
{
        char * pRecStr = 0;
        int c;
       
       
        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 )
                pRecStr = strEsp8266_Fram_Record .Data_RX_BUF;
       
        else
        {
                if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+IPD" ) )
                        pRecStr = strEsp8266_Fram_Record .Data_RX_BUF;
               
                //b = strncpy(a,strEsp8266_Fram_Record .Data_RX_BUF,c);
               
                c = strlen(strEsp8266_Fram_Record .Data_RX_BUF);
               
                macPC_Usart ( "c1=%d\n",c);
                strncpy(a,strEsp8266_Fram_Record .Data_RX_BUF,c);
               
               
                macPC_Usart ( "c2=%d\n",c);
                //macPC_Usart ( "b=%s\n",  b );
                   //pRecStr = &a[0];
               
                macPC_Usart ( "3=%s\n",strEsp8266_Fram_Record .Data_RX_BUF );
                macPC_Usart ( "4=%s\n",  a );

        }

        return pRecStr;
       
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

volatile uint8_t ucTcpClosedFlag = 0;

char cStr [ 1500 ] = { 0 };

char *test;

/**
  * @brief  ESP8266 (Sta Tcp Client)透传
  * @param  无
  * @retval 无
  */
void ESP8266_StaTcpClient_UnvarnishTest ( void )
{
        uint8_t ucStatus;
       
        char cStr [ 100 ] = { 0 };
       
               
  printf ( "\r\n正在配置 ESP8266 ......\r\n" );

        macESP8266_CH_ENABLE();
       
        ESP8266_AT_Test ();
       
        ESP8266_Net_Mode_Choose ( STA );

  while ( ! ESP8266_JoinAP ( macUser_ESP8266_ApSsid, macUser_ESP8266_ApPwd ) );       
       
        ESP8266_Enable_MultipleId ( DISABLE );
       
        while ( !        ESP8266_Link_Server ( enumTCP, macUser_ESP8266_TcpServer_IP, macUser_ESP8266_TcpServer_Port, Single_ID_0 ) );
       
        //while ( ! ESP8266_UnvarnishSend () );
       
        printf ( "\r\n配置 ESP8266 完毕\r\n" );
       
                       
                sprintf ( cStr,
"ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n" );


                //ESP8266_SendString ( ENABLE, cStr, 0, Single_ID_0 );               //发送数据
               
                ESP8266_SendString ( DISABLE, cStr, 104, Single_ID_0 );               //发送数据
               
                Delay_ms ( 100 );

         // ESP8266_ExitUnvarnishSend();
               


       
        while ( 1 )
        {
/*               
                sprintf ( cStr,
"ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n\
ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n\
ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n\
ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n\
ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n\
ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n\
ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n\
ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n\
ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n\
ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n" );
               
                ESP8266_SendString ( ENABLE, cStr, 0, Single_ID_0 );               //发送数据
               
                Delay_ms ( 100 );
*/
   //ESP8266_ExitUnvarnishSend();
               
               
         
               
   test = ESP8266_ReceiveString(1);

   macPC_Usart ( "test=%s\n", test );
         
         
               
                if ( ucTcpClosedFlag )                                             //检测是否失去连接
                {
                        ESP8266_ExitUnvarnishSend ();                                    //退出透传模式
                       
                        do ucStatus = ESP8266_Get_LinkStatus ();                         //获取连接状态
                        while ( ! ucStatus );
                       
                        if ( ucStatus == 4 )                                             //确认失去连接后重连
                        {
                                printf ( "\r\n正在重连热点和服务器 ......\r\n" );
                               
                                while ( ! ESP8266_JoinAP ( macUser_ESP8266_ApSsid, macUser_ESP8266_ApPwd ) );
                               
                                while ( !        ESP8266_Link_Server ( enumTCP, macUser_ESP8266_TcpServer_IP, macUser_ESP8266_TcpServer_Port, Single_ID_0 ) );
                               
                                printf ( "\r\n重连热点和服务器成功\r\n" );

                        }
                       
                        while ( ! ESP8266_UnvarnishSend () );               
                       
                }
        }
       
               
}



轩辕紫木 回答时间:2018-11-7 23:39:04
jeffhe1 发表于 2018-11-7 19:44
/*
* 函数名:ESP8266_ReceiveString
* 描述  :WF-ESP8266模块接收字符串

你在函数里面打印的是strEsp8266_Fram_Record .Data_RX_BUF,pRecStr 是经过判断才赋值的,前面的兄弟也说过,建议将判断语句( if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+IPD" ) ))去掉,或者
return  (char *) strEsp8266_Fram_Record .Data_RX_BUF.然后在看看数据是啥样的
helloworld121 回答时间:2020-2-3 21:24:46
我也遇到了相同的问题。。请问有人解决了吗
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版