OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6199|回复: 3

战舰V3里的esp8266历程,有点问题

[复制链接]

33

主题

87

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2017-1-2
在线时间
31 小时
发表于 2017-2-22 11:47:57 | 显示全部楼层 |阅读模式
1金钱
历程里有一个atk_8266_consta_check函数是在检查是否有设备与esp8266相连。函数如下:
//获取ATK-ESP8266模块的连接状态
//返回值:0,未连接;1,连接成功.
u8 atk_8266_consta_check(void)
{
        u8 *p;
        u8 res;
        if(atk_8266_quit_trans())return 0;                        //退出透传
        atk_8266_send_cmd("AT+CIPSTATUS",":",50);        //发送AT+CIPSTATUS指令,查询连接状态
        p=atk_8266_check_cmd("+CIPSTATUS:");
        res=*p;                                                                        //得到连接状态       
        return res;
}


我写了一句话想让 程序检测到连接成功时继续执行下面的语句。所以我编了这样一段话:
        while(!atk_8266_consta_check()){delay_ms(800);}



然后我发现,设备没有连接时,程序根本没有停留在这里。
于是我就怀疑程序 p=atk_8266_check_cmd("+CIPSTATUS:");  这句有问题。!!!!!
u8* atk_8266_check_cmd(u8 *str)
{
       
        char *strx=0;
        if(USART3_RX_STA&0X8000)                //接收到一次数据了
        {
                USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符
                strx=strstr((const char*)USART3_RX_BUF,(const char*)str);
        }
        return (u8*)strx;
}


于是我就敲了一段代码到VC++6.0里,想看看返回值。
然后发现函数的传参有问题,VC报错,这个错误看图????

然后敲在KEIL里,然后那句话是WARNING,不报错,但是是一样的提示。
我的测试程序如图。
大神帮忙看看呀!!!!
还有为什么keil里提示主函数返回值要是int型????

KEIL

KEIL

VC

VC

最佳答案

查看完整内容[请看2#楼]

好吧!试了一天,我自己发现了问题。 //获取ATK-ESP8266模块的连接状态 //返回值:0,未连接;1,连接成功. u8 atk_8266_consta_check(void) { u8 *p; u8 res; if(atk_8266_quit_trans())return 0; //退出透传 atk_8266_send_cmd("AT+CIPSTATUS",":",50); //发送AT+CIPSTATUS指令,查询连接状态 p=atk_8266_check_cmd("+CIPSTATUS:"); res=*p; //得到连接状态 return res; } 被这个函数的说明误解了 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

87

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2017-1-2
在线时间
31 小时
 楼主| 发表于 2017-2-22 11:47:58 | 显示全部楼层
好吧!试了一天,我自己发现了问题。
//获取ATK-ESP8266模块的连接状态
//返回值:0,未连接;1,连接成功.
u8 atk_8266_consta_check(void)
{
        u8 *p;
        u8 res;
        if(atk_8266_quit_trans())return 0;                        //退出透传
        atk_8266_send_cmd("AT+CIPSTATUS",":",50);        //发送AT+CIPSTATUS指令,查询连接状态
        p=atk_8266_check_cmd("+CIPSTATUS:");
        res=*p;                                                                        //得到连接状态       
        return res;
}

被这个函数的说明误解了,其实返回值是+CIPSTATUS在接收缓冲中的位置

//ATK-ESP8266发送命令后,检测接收到的应答
//str:期待的应答结果
//返回值:0,没有得到期待的应答结果
//    其他,期待应答结果的位置(str的位置)
u8* atk_8266_check_cmd(u8 *str)
{
       
        char *strx=0;
        if(USART3_RX_STA&0X8000)                //接收到一次数据了
        {
                USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符
                strx=strstr((const char*)USART3_RX_BUF,(const char*)str);
        }
        return (u8*)strx;
}

是内存地址。
所以我用LCD_Show时,显示的都是那个变量的地址。
所以正确的用法是
        constate=atk_8266_consta_check();
        while(constate!='+'){constate=atk_8266_consta_check();delay_ms(800);}
回复

使用道具 举报

33

主题

87

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2017-1-2
在线时间
31 小时
 楼主| 发表于 2017-2-22 15:08:05 | 显示全部楼层
这个功能绝对有问题
我把返回值打印了出来,发现p是248,明明字符串没有匹配,返回值却不是0
u8 atk_8266_consta_check(void)
{
        u8 *p;
        u8 res;
        u8 ssr;
        if(atk_8266_quit_trans())return 0;                        //退出透传
        atk_8266_send_cmd("AT+CIPSTATUS",":",50);        //发送AT+CIPSTATUS指令,查询连接状态
        p=atk_8266_check_cmd("+CIPSTATUS:");
       

        res=*p;       
         POINT_COLOR=RED;
        LCD_ShowString(50,70,200,16,16,"p");                        LCD_ShowString(80,70,200,16,16,p);        LCD_ShowNum(100,70,*p,4,16);
        LCD_ShowString(50,90,200,16,16,"res");                LCD_ShowNum(80,90,res,4,16);                       
        return res;
}
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2017-3-31
在线时间
14 小时
发表于 2017-4-12 09:06:07 | 显示全部楼层
你好  方便将这个例程发我学习下吗 谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 05:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表