OpenEdv-开源电子网

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

原子的ESP8266的程序自己给改了,用来发送ADC的数据到PC端。接收数据格式有问题,求大神看一下

[复制链接]

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
发表于 2017-11-22 11:47:54 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 Rainday 于 2017-11-22 12:10 编辑

ESP8266源程序是有三种模式分别是STA+AP、STA、AP模式,可以通过按键选择触屏写字,功能很全很强大。现在我给简化了,只要AP功能还加入了ADC程序。板载wifi是原子送的ESP8266,PC端是自己买的安可信的ES8266+转串口工具。调试软件也用的安信可的,接收数据如下图。调试工具的接收窗口,除了有ADC的数值外还有AT+CIPSEND=0,25和+IPD,25:这两串字符,相应的程序还不能注释掉,否则直接没数据。不知道怎么改了,求助。
QQ截图20171122114331.png QQ截图20171122114229.png QQ截图20171122120949.png

[mw_shl_code=c,true]这是wifiap.c程序
#include "common.h"
#include "adc.h"
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32开发板
//ATK-ESP8266 WIFI模块 WIFI AP驱动代码           
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2014/4/3
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved                                                                          
///////////////////////////////////////////////////////////////////////////////////////////////////////////


//ATK-ESP8266 WIFI AP测试
//用于测试TCP/UDP连接
//返回值:0,正常
//    其他,错误代码
u8 atk_8266_wifiap_test(void)
{
        u8 netpro=0;        //网络模式
        u8 ipbuf[16];         //IP缓存
        u8 *p;
        u16 t=999;                //加速第一次获取链接状态
        u16 rlen=0;
        u8 constate=0;        //连接状态
        u16 temp;
        p=mymalloc(SRAMIN,32);                                                        //申请32字节内存
        LCD_Clear(WHITE);
        POINT_COLOR=RED;
        Show_Str_Mid(0,30,"ATK-ESP WIFI-AP 测试",16,240);
        sprintf((char*)p,"AT+CIPSERVER=1,%s",(u8*)portnum);//IP输入:192.168.4.1
        atk_8266_send_cmd(p,"OK",20);     //开启Server模式,端口号为8086
        POINT_COLOR=RED;
        Show_Str_Mid(0,30,"ATK-ESP WIFI-AP 测试",16,240);               
        Show_Str(30,50,200,16,"配置ATK-ESP模块成功!",12,0);
        LCD_Fill(30,80,239,80+12,WHITE);
        atk_8266_get_wanip(ipbuf);//服务器模式,获取WAN IP
        sprintf((char*)p,"IP地址:%s 端口:%s",ipbuf,(u8*)portnum);
        Show_Str(30,65,200,12,p,12,0);                                //显示IP地址和端口        
        Show_Str(30,80,200,12,"状态:",12,0);                 //连接状态
        Show_Str(120,80,200,12,"模式:",12,0);                 //连接状态
        Show_Str(30,100,200,12,"发送数据:",12,0);         //发送数据
        Show_Str(30,115,200,12,"接收数据:",12,0);        //接收数据
        POINT_COLOR=BLUE;
        Show_Str(120+30,80,200,12,(u8*)ATK_ESP8266_WORKMODE_TBL[netpro],12,0);                 //连接状态
        USART3_RX_STA=0;
        while(1)
                {
                        if(constate!='+')t=200;                //状态为还未连接,立即更新连接状态
                        else t=0;                   //状态为已经连接了,2秒后再检查
                        if(t==200)//连续2秒钟没有收到任何数据,检查连接是不是还存在.
                                {
                                        constate=atk_8266_consta_check();//得到连接状态
                                        if(constate=='+')Show_Str(30+30,80,200,12,"连接成功",12,0);  //连接状态
                                        else Show_Str(30+30,80,200,12,"连接失败",12,0);                    
                                        t=0;
                                }
//                                atk_8266_at_response(1);
                                temp=Get_Adc(ADC_Channel_1);
//                                printf("%d\r\n",temp);
                                sprintf((char*)p,"%d\r\n",temp);//测试数据
                                Show_Str(30+54,100,200,12,p,12,0);//显示准备发送的数据
                                atk_8266_send_cmd("AT+CIPSEND=0,25","OK",4);  //发送指定长度的数据
                                atk_8266_send_data(p,"OK",4);  //发送指定长度的数据
                        
//                        接收数据程序
//                        if(USART3_RX_STA&0X8000)                //接收到一次数据了
//                                {
//                                        rlen=USART3_RX_STA&0X7FFF;        //得到本次接收到的数据长度
//                                        USART3_RX_BUF[rlen]=0;                //添加结束符
//                                        printf("%s",USART3_RX_BUF);        //发送到串口   
//                                        sprintf((char*)p,"收到%d字节,内容如下",rlen);//接收到的字节数
//                                        LCD_Fill(30+54,115,239,130,WHITE);
//                                        POINT_COLOR=BRED;
//                                        Show_Str(30+54,115,156,12,p,12,0);                         //显示接收到的数据长度
//                                        POINT_COLOR=BLUE;
//                                        LCD_Fill(30,130,239,319,WHITE);
//                                        Show_Str(30,130,180,190,USART3_RX_BUF,12,0);//显示接收到的数据  
//                                        USART3_RX_STA=0;
//                                        if(constate!='+')t=200;                //状态为还未连接,立即更新连接状态
//                                        else t=0;                   //状态为已经连接了,2秒后再检查
//                                        }

                }
                myfree(SRAMIN,p);                //释放内存
}







[/mw_shl_code]

[mw_shl_code=c,true]这是common.c程序
#include "common.h"
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32开发板
//ATK-ESP8266 WIFI模块 公用驱动代码           
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2014/4/3
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved                                                                          
///////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////////
//用户配置区

//连接端口号:8086,可自行修改为其他端口.
const u8* portnum="8086";                 

//WIFI STA模式,设置要去连接的路由器无线参数,请根据你自己的路由器设置,自行修改.
const u8* wifista_ssid="ALIENTEK";                        //路由器SSID号
const u8* wifista_encryption="wpawpa2_aes";        //wpa/wpa2 aes加密方式
const u8* wifista_password="15902020353";         //连接密码

//WIFI AP模式,模块对外的无线参数,可自行修改.
const u8* wifiap_ssid="ATK-ESP8266";                        //对外SSID号
const u8* wifiap_encryption="wpawpa2_aes";        //wpa/wpa2 aes加密方式
const u8* wifiap_password="12345678";                 //连接密码

///////////////////////////////////////////////////////////////////////////////////////////////////////////
//4个网络模式
const u8 *ATK_ESP8266_CWMODE_TBL[3]={"STA模式 ","AP模式 ","AP&STA模式 "};        //ATK-ESP8266,3种网络模式,默认为路由器(ROUTER)模式
//4种工作模式
const u8 *ATK_ESP8266_WORKMODE_TBL[3]={"TCP服务器","TCP客户端"," UDP 模式"};        //ATK-ESP8266,4种工作模式
//5种加密方式
const u8 *ATK_ESP8266_ECN_TBL[5]={"OPEN","WEP","WPA_PSK","WPA2_PSK","WPA_WAP2_PSK"};
///////////////////////////////////////////////////////////////////////////////////////////////////////////

//usmart支持部分
//将收到的AT指令应答数据返回给电脑串口
//mode:0,不清零USART3_RX_STA;
//     1,清零USART3_RX_STA;
void atk_8266_at_response(u8 mode)
{
        if(USART3_RX_STA&0X8000)                //接收到一次数据了
        {
                USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符
                printf("%s",USART3_RX_BUF);        //发送到串口
                if(mode)USART3_RX_STA=0;
        }
}
//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;
}
//向ATK-ESP8266发送命令
//cmd:发送的命令字符串
//ack:期待的应答结果,如果为空,则表示不需要等待应答
//waittime:等待时间(单位:10ms)
//返回值:0,发送成功(得到了期待的应答结果)
//       1,发送失败
u8 atk_8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
        u8 res=0;
        USART3_RX_STA=0;
        u3_printf("%s\r\n",cmd);        //发送命令
        if(ack&&waittime)                //需要等待应答
        {
                while(--waittime)        //等待倒计时
                {
                        delay_ms(10);
                        if(USART3_RX_STA&0X8000)//接收到期待的应答结果
                        {
                                if(atk_8266_check_cmd(ack))
                                {
//                                        printf("ack:%s\r\n",(u8*)ack);
                                        break;//得到有效数据
                                }
                                        USART3_RX_STA=0;
                        }
                }
                if(waittime==0)res=1;
        }
        return res;
}
//向ATK-ESP8266发送指定数据
//data:发送的数据(不需要添加回车了)
//ack:期待的应答结果,如果为空,则表示不需要等待应答
//waittime:等待时间(单位:10ms)
//返回值:0,发送成功(得到了期待的应答结果)luojian
u8 atk_8266_send_data(u8 *data,u8 *ack,u16 waittime)
{
        u8 res=0;
        USART3_RX_STA=0;
        u3_printf("%s",data);        //发送命令
        if(ack&&waittime)                //需要等待应答
        {
                while(--waittime)        //等待倒计时
                {
                        delay_ms(10);
                        if(USART3_RX_STA&0X8000)//接收到期待的应答结果
                        {
                                if(atk_8266_check_cmd(ack))break;//得到有效数据
                                USART3_RX_STA=0;
                        }
                }
                if(waittime==0)res=1;
        }
        return res;
}
//ATK-ESP8266退出透传模式
//返回值:0,退出成功;
//       1,退出失败
u8 atk_8266_quit_trans(void)
{
        while((USART3->SR&0X40)==0);        //等待发送空
        USART3->DR='+';      
        delay_ms(15);                                        //大于串口组帧时间(10ms)
        while((USART3->SR&0X40)==0);        //等待发送空
        USART3->DR='+';      
        delay_ms(15);                                        //大于串口组帧时间(10ms)
        while((USART3->SR&0X40)==0);        //等待发送空
        USART3->DR='+';      
        delay_ms(500);                                        //等待500ms
        return atk_8266_send_cmd("AT","OK",20);//退出透传判断.
}

//获取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;
}

//获取Client ip地址
//ipbuf:ip地址输出缓存区
void atk_8266_get_wanip(u8* ipbuf)
{
        u8 *p,*p1;
                if(atk_8266_send_cmd("AT+CIFSR","OK",50))//获取WAN IP地址失败
                {
                        ipbuf[0]=0;
                        return;
                }               
                p=atk_8266_check_cmd("\"");
                p1=(u8*)strstr((const char*)(p+1),"\"");
                *p1=0;
                sprintf((char*)ipbuf,"%s",p+1);        
}




//ATK-ESP8266模块测试主函数
void atk_8266_test(void)
{

        while(1)
        {
                atk_8266_at_response(1);//检查ATK-ESP8266模块发送过来的数据,及时上传给电脑

                atk_8266_wifiap_test();        //WIFI AP测试

                }         

}




[/mw_shl_code]


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
 楼主| 发表于 2017-11-22 12:02:22 | 显示全部楼层
WIFI发送ADC采集数据到电脑.rar (8.64 MB, 下载次数: 702)
回复

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
 楼主| 发表于 2017-11-22 17:31:09 | 显示全部楼层
求帮忙
回复

使用道具 举报

9

主题

84

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2017-4-1
在线时间
4 小时
发表于 2017-11-22 18:12:23 | 显示全部楼层
WiFi模块购买地址 https://shop67012462.taobao.com
回复

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2014-12-20
在线时间
44 小时
发表于 2017-11-23 12:30:50 | 显示全部楼层
把ESP8266设置成透传模式试试
回复

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2014-12-20
在线时间
44 小时
发表于 2017-11-23 12:31:43 | 显示全部楼层
透传模式下就没有+IPD 了
回复

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
 楼主| 发表于 2017-11-23 17:38:11 | 显示全部楼层
beyondvs 发表于 2017-11-23 12:31
透传模式下就没有+IPD 了

感谢回答!我试下
回复

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
 楼主| 发表于 2017-11-23 17:59:33 | 显示全部楼层
beyondvs 发表于 2017-11-23 12:31
透传模式下就没有+IPD 了

原子的程序有点问题STA+AP和STA模式直接卡死半天没反应,也就AP模式TCP Server模式能直接连接,TCP Clent和UDP触屏点不动或者错位。
回复

使用道具 举报

2

主题

3

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2018-3-28
在线时间
4 小时
发表于 2018-3-29 23:38:15 | 显示全部楼层
大哥,你的程序后来有改好吗?我现在正好在做这么一个东西,能不能发一份给我参考一下
回复

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
 楼主| 发表于 2018-3-31 18:32:35 | 显示全部楼层
BJCSSB 发表于 2018-3-29 23:38
大哥,你的程序后来有改好吗?我现在正好在做这么一个东西,能不能发一份给我参考一下

我现在改为用电刷了,主要是旋转体传出信号。那个程序我已经放弃了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 08:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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