2226|3

2

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

esp8266无法将数据传到APP上 [复制链接]

希望通过esp8266令APP显示数据,现在的情况是WIFI能与APP建立连接,通过电脑也能收到串口的数据,但是无法将数据通过wifi发送到手机上,请问如何解决呢?  (电脑的传输线和esp8266使用的是一个串口)
相关程序如下:

单片机主函数:

#include<reg52.h>
#include"dht11.h"
#include "string.h"
#define uchar unsigned char 
#define uint unsigned int
unsigned char idata Rxbuff[50],Rxnum;
extern unsigned char  F16T,F16RH;        //温湿度数据
sbit LED1=P2^2;
sbit LED2=P2^4;
unsigned char getflag;//获取标志
void InitUART(void);
void delayms(unsigned int x);
void UART_send_byte(char dat);
void ESP8266_SERVER(void);
void Send_Str(unsigned char *buf);

void main()
{
          unsigned char   Tx_Buf[10];
        delayms(500);
        delayms(1000);          //延时一段时间,让WIFI模块稳定
        InitUART();                        //初始化串口
    ESP8266_SERVER();        //初始化ESP8266
        LED1=0;
        while(1)        
        {          
                        getDHT11(); //获取温湿度值
                          Tx_Buf[0]=F16T/10%10+0x30;        //帧头
                          Tx_Buf[1]=F16T%10+0x30;                 //将温湿度数据送往发送数组,送给模块让手机APP显示
                          Tx_Buf[2]= ';';                
                          Tx_Buf[3]=F16RH/10%10+0x30;
                          Tx_Buf[4]=F16RH%10+0x30;
                        Send_Str("AT+CIPSEND=0,5\r\n");
                        delayms(300);
                           Send_Str(Tx_Buf);//发送数据
                        LED2=0;

        }
}
void InitUART(void)         //这是串口的基本配置,配置他的波特率是9600.这些参数都是标准的。
{
    TMOD = 0x20;
    SCON = 0x50;
    TH1 = 0xFD;
    TL1 = TH1;
    PCON = 0x00;
    EA = 1;
    ES = 1;
    TR1 = 1;
}
void delayms(unsigned int x)
{
        unsigned int i;
        while(x--)
                for(i=125;i>0;i--);
}
//UART 发送一字节
void UART_send_byte(char dat)
{
        SBUF = dat;                                        //发送
        while (TI == 0);                        //等待发送完毕
        TI = 0;                                                //清发送完毕中断请求标志位 
}
//UART 发送字符串
void Send_Str(unsigned char *buf)
{
        while (*buf != '\0')
        {
                UART_send_byte(*buf++);
        }
}

void ESP8266_SERVER(void)//建立服务器
{
        ES = 0;
        TI = 1; 
        Send_Str("AT\r\n");
        delayms(500);
        Send_Str("AT\r\n");
        delayms(500);
        Send_Str("AT+CWMODE=2\r\n");          //服务器搭建在WIFI模块上
        delayms(500);
           Send_Str("AT+CWSAP=\"WiFi_mushu\",\"12345678\",5,3\r\n");          //设置显示名称:wifi,密码:12345678
        delayms(500);
        Send_Str("AT+CIPMUX=1\r\n");//启动多连接,建立服务器都需要配置
        delayms(500);        
        Send_Str("AT+CIPSERVER=1,5000\r\n");//建立服务器
        delayms(500);        
        Send_Str("AT+CIPSTO=0\r\n");
        TI = 0;
        ES = 1;        
}  


APP相关程序
package com.example.wifi_mushu;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class MainActivity extends AppCompatActivity {
    //定义控件
    EditText edGateIpedGateSn;
    Button btnSearchbtnLogin;
    //消息机制
    private Handler messageHandler;
    //开辟一个socket
    Socket socket null;

    OutputStream OutputStream null;//定义数据输出流,用于发送数据
    BufferedReader bufferedReader;//声明输入流对象
    InputStream InputStream null;//定义数据输入流,用于接收数据

    //定义逻辑变量,用于判断服务器连接状态
    boolean isConnected false;

    //用于控制读数据线程是否执行
    boolean RD false;

    //测试区域
    Button fs;
    EditText sjfssjjs;

    @SuppressLint("HandlerLeak")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //控件绑定
        edGateIp = findViewById(R.id.edGateIP);
        edGateSn = findViewById(R.id.edGateSn);
        btnSearch = findViewById(R.id.btnSearch);
        btnLogin = findViewById(R.id.btnLogin);
        //显示控件
        final TextView wendu = (TextView)findViewById(R.id.wendu);
        final TextView shidi = (TextView)findViewById(R.id.shidu);
        final TextView kongqi = (TextView)findViewById(R.id.kongqi);

        //自动填写按钮事件
        btnSearch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //自动填写服务器固定的IP地址和端口
                edGateIp.setText("192.168.4.1");
                edGateSn.setText("5000");
            }
        });

        //连接服务器按钮事件
        btnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //容错机制
                //取出文本框内容,用来判断输入框是否为空
                String ip = edGateIp.getText().toString();
                String sn = edGateSn.getText().toString();

                if ((ip == null || ip.length() == 0) && (sn == null || sn.length() == 0)) {
                    Toast.makeText(MainActivity.this"IP地址、端口号不能为空", Toast.LENGTH_SHORT).show();
                } else if (ip == null || ip.length() == 0) {
                    Toast.makeText(MainActivity.this"IP地址不能为空", Toast.LENGTH_SHORT).show();
                } else if (sn == null || sn.length() == 0) {
                    Toast.makeText(MainActivity.this"端口号不能为空", Toast.LENGTH_SHORT).show();
                } else {
                    //判断服务器连接状态
                    if (isConnected != true) {
                        //创建一条新的Socket(以线程的方式)连接
                        new ClientThread().start();
                        //按钮文字改变
                        btnLogin.setText("断开连接");
                        //页面消息
                        Toast.makeText(MainActivity.this"服务器连接成功", Toast.LENGTH_SHORT).show();
                        //二次判断,服务器是否已连接上
                        if (socket == null) {
                            //没连接上的话,按钮文字改为连接服务器,页面消息提示
                            btnLogin.setText("连接服务器");
                            Toast.makeText(MainActivity.this"连接错误,请检查WiFi是否连上,IP、端口是否输入正确!", Toast.LENGTH_SHORT).show();
                        }
                    } else {
                        //按钮按下的时候已在连接情况下,服务器断开
                        if (socket != null) {
                            try {
                                //退出服务器
                                socket.close();
                                //服务器状态为空
                                socket null;
                                //服务器连接转态改为空
                                isConnected false;
                                //读数据线程不执行
                                RD false;

                                btnLogin.setText("连接服务器");
                                //页面文字显示
                                Toast.makeText(MainActivity.this"与服务器断开连接!", Toast.LENGTH_SHORT).show();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                            //
                        }
                    }
                }
            }
        });

        //消息处理机制
        messageHandler new Handler() { //等待socket连接成功
            public void handleMessage(android.os.Message msgMessage) {
                String receiveString = "";

                switch (msgMessage.what) {
                    case 1:
                        receiveString =  msgMessage.obj.toString();
                        String  temp[] = DataString.split(";");
                        wendu.setText(temp[0]);
                        shidi.setText(temp[1]);
                        kongqi.setText(temp[2]);


                }
            }

        };
    }

    //用线程创建Socket连接,线程不允许更新UI(用Handler实现)
    public class ClientThread extends Thread {
        public void run() {
            //定义两个变量用于储存ip和端口号
            InetAddress GateIp;
            int GateSn;
            try {
                //判断socked的状态,防止重复执行
                if (socket == null) {
                    //获取输入的IP地址
                    GateIp = InetAddress.getByName(edGateIp.getText().toString());
                    //获取输入的端口
                    GateSn = Integer.parseInt(edGateSn.getText().toString());
                    //新建一个socket连接
                    socket new Socket(GateIp, GateSn);
                    //获得socket的输出流,接收数据
                    InputStream socket.getInputStream();

                    //取得输入流、输出流
                    bufferedReader new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    OutputStream socket.getOutputStream();

                    //接收数据可用于主线程也可直接在此线程操作
                    char[] buffer = new char[265];//定义数组接收输入流数据
                    String bufferString = "";//定义一个字符接收字符串数组数据
                    int count = 0;//初始化buffer数组长度为0
                    int tag = 0;//初始写入数组的位置

                    //说明服务器已建立且连接
                    isConnected true;

                    //无限循环重复接收输入流数据并进行处理
                    while (true) {
                        //当输入流写入buffer数组的长度大于0时,即为已收到数据
                        while ((count = bufferedReader.read(buffer)) > 0) {
                            //buffer数组的数据全部写入bufferString字符类型
                            while (tag < buffer.length) {
                                bufferString = bufferString + buffer[tag];
                                tag++;
                            }
                            //将数据给messageHandler刷新UI界面
                            Message msgMessagr = new Message();
                            msgMessagr.obj = bufferString;
                            msgMessagr.what 1;
                            messageHandler.sendMessage(msgMessagr);
                            //初始化数据,以便处理下一条输入流信息
                            tag = 0;
                            bufferString = "";
                        }
                    }
                }
                //出错提示
                //UnknownHostExceptionDNS解析出错
                //IOException读写文件异常
            catch (UnknownHostException e) {
                //在命令行打印异常信息在程序中出错的位置及原因
                e.printStackTrace();
            } catch (IOException e) {
                //在命令行打印异常信息在程序中出错的位置及原因
                e.printStackTrace();
            }
        }
    }
}

 

chuankou.jpg (143.7 KB, 下载次数: 0)

chuankou.jpg

danpianj.jpg (168.9 KB, 下载次数: 0)

danpianj.jpg

Screenshot_20200413-084926.png (93.8 KB, 下载次数: 0)

Screenshot_20200413-084926.png
此帖出自51单片机论坛

最新回复

你好! 1、首先波特率要选对,WIFI初始化完成 2、硬件晶振用11.0592Mhz的,串口误差小 3、发送给APP的字节数要对,才能发全数据 4、这个做的一个APP,你看下效果 [attach]471280[/attach]可以通过APP接收数据,同时显示数据曲线   详情 回复 发表于 2020-4-18 22:38
点赞 关注
 

回复
举报

1万

帖子

24

TA的资源

版主

沙发
 

把问题关键点贴出来吧

此帖出自51单片机论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
dcexpert 发表于 2020-4-13 11:34 把问题关键点贴出来吧

 就在wifi发送的数据,APP接收不到,但wifi发送的AT指令却能接收到

此帖出自51单片机论坛
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(初级)

4
 

你好!

1、首先波特率要选对,WIFI初始化完成

2、硬件晶振用11.0592Mhz的,串口误差小

3、发送给APP的字节数要对,才能发全数据

4、这个做的一个APP,你看下效果

可以通过APP接收数据,同时显示数据曲线

此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表