esp8266 收到上位机发来的信息之后不显示+IPD后的内容

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了esp8266 收到上位机发来的信息之后不显示+IPD后的内容相关的知识,希望对你有一定的参考价值。

如图所示,就是上位机发送了字符 26 之后esp8266模块返回了+IPD,0,3: 但是没有显示内容,求大神解决!!!

esp8266 收到上位机发来的信息之后不显示+IPD后的内容,esp8266模块返回了+IPD,0,3:
说明收到了上位机发送来的3个字符(不过是不可显示的字符),如果选择 HEX显示,就可以显示十六进制代码 2B(+) 49(I) 50(P) 44(D) 2C(,) 30(0) 2C(,) 33(3) 3A(:) 后面还有3个十六进制代码。
参考技术A AT+CIPRECVMODE=0, 改成这个试试
TCP 连接的数据接收⽅方式,默认为主动模式 • 0:主动模式;收到 TCP 数据时,ESP8266 通过 +IPD 主动将数据通过串串⼝口发给 MCU; • 1:被动模式;ESP8266 默认使⽤用 2920 bytes 的 buffer ⽤用于缓存接收到的 TCP 数据,被动等 待 MCU 读取;接收 buffer 满后,将阻塞对端 TCP 发送数据。
参考技术B 并没有正常通讯,继续调整吧

STM32单片机通过ESP8266WiFi模块与Android APP实现数据传输---上位机搭建

事物的难度远远低于对事物的恐惧
完成对STM32单片机和ESP8266 WiFi模块的配置之后,接下来需要完成Android APP代码的编写以及实现。

1.添加网络权限

因为我们需要对WiFi进行操作,所以需要网络的权限,在AndroiManifest.xml文件中加入以下代码:

<uses-permission android:name="android.permission.INTERNET" />

2.建立TCP连接

首先通过文本输入控件得到IP地址和端口号,然后建立Socket连接。

case R.id.btn_turn:
                if (mSocket == null || !mSocket.isConnected()) 
                    if(!TextUtils.isEmpty(mText_ip.getText()) && !TextUtils.isEmpty(mText_port.getText()))
                        mip = mText_ip.getText().toString();
                        mport = Integer.parseInt(mText_port.getText().toString());
                        Log.i(TAG, "onClick: "+mport);
                        mConnectThread = new ConnectThread(mip, mport);
                        mConnectThread.start();
                    else if(TextUtils.isEmpty(mText_ip.getText()))
                        Toast.makeText(this,"请输入IP地址",Toast.LENGTH_SHORT).show();
                    else if(TextUtils.isEmpty(mText_port.getText()))
                        Toast.makeText(this,"请输入端口号",Toast.LENGTH_SHORT).show();
                    
                
                if (mSocket != null && mSocket.isConnected()) 
                    try 
                        mSocket.close();
                        mSocket = null;
                        mBtn_turn.setText("连接");
                        Toast.makeText(this, "连接已断开", Toast.LENGTH_SHORT).show();
                     catch (IOException e) 
                        e.printStackTrace();
                    
                
                break;

上述代码是通过按钮点击事件获得到IP地址和端口号,然后通过创建一个ConnectThread类对象并调用里面的run()方法实现TCP连接。该类的代码如下:

private class ConnectThread extends Thread 
        private String ip;
        private int port;
        public ConnectThread(String ip, int port) 
            this.ip = ip;
            this.port = port;
        
        @Override
        public void run() 
            try 
                mSocket = new Socket(ip, port);
                out = new PrintStream(mSocket.getOutputStream());
                mBufferedReader = new BufferedReader(new InputStreamReader(mSocket.getInputStream()));
                runOnUiThread(new Runnable() 
                    @Override
                    public void run() 
                        mBtn_turn.setText("断开");
                        Toast.makeText(MainActivity.this, "连接成功", Toast.LENGTH_SHORT).show();
                    
                );
             catch (IOException e) 
                e.printStackTrace();
                runOnUiThread(new Runnable() 
                    @Override
                    public void run() 
                        Toast.makeText(MainActivity.this, "连接失败", Toast.LENGTH_SHORT).show();
                    
                );
            
        
    

在run()方法中不仅建立了连接,而且还获得了该连接的输出流对象 out (用于APP向单片机发送数据)和输入流对象 mBufferedReader (用于APP接收单片机发来的数据)。

3.APP发送数据

在上文中得到了输出流对象 out,利用它的print()和flush()方法完成数据的发送,代码如下:

case R.id.btn_send:
                final String str = mSend_text.getText().toString();
                if (str != null && out != null) 
                    new Thread(new Runnable() 
                        @Override
                        public void run() 
                            out.print(str);
                            out.flush();
                        
                    ).start();

                
                break;

4.APP接收数据

在这里本文使用了定时器,设置每隔一段时间就去判断数据输入流对象mBufferedReader的方法ready(),从而得知是否有数据到来了,如果有就存入到一个全局变量中,然后通过Handler对象发送消息,进而实现在UI线程中更新TextView控件,代码如下:

private class ReceiveDataTask extends TimerTask 
        @Override
        public void run() 
            try 
                if (mBufferedReader != null && (mBufferedReader.ready())) 
                    char[] readbuff = new char[30];
                    byte[] readByte = new byte[30];
                    mBufferedReader.read(readbuff, 0, readbuff.length);
                    tempStrng = String.valueOf(readbuff);
                    readByte = tempStrng.getBytes();
                    readStrng = new String(readByte, 0, readByte.length, "GB2312");
                    Message message = Message.obtain();
                    message.what = 1212;
                    mHandler.sendMessage(message);
                
             catch (IOException e) 
                e.printStackTrace();
            

        
    

    private void startTimer() 
        Log.i(TAG, "startTimer:");
        if (mTimer == null) 
            mTimer = new Timer();
        
        if (mReceiveDataTask == null) 
            mReceiveDataTask = new ReceiveDataTask();
        
        mTimer.schedule(mReceiveDataTask, 0, 10);
    

    private void stopTimer() 
        Log.i(TAG, "stopTimer: ");
        if (mReceiveDataTask != null) 
            mReceiveDataTask.cancel();
            mReceiveDataTask = null;
        
        if (mTimer != null) 
            mTimer.cancel();
            mTimer = null;
        
    

消息处理代码如下:

private class myHandler extends Handler 
        @Override
        public void handleMessage(@NonNull Message msg) 
            super.handleMessage(msg);
            switch (msg.what) 
                case 1212:
                    mSend_text_dis.setText(readStrng);
                    break;
            
        
    

开启定时器和关闭定时器代码如下:

    @Override
    protected void onStart() 
        super.onStart();
        startTimer();
    

    @Override
    protected void onStop() 
        super.onStop();
        stopTimer();
    

现在就可以实现了数据的互相传输。

STM32单片机和Android APP源代码免费获取方式:

下位机硬件配置可以参考这个文章:
STM32单片机通过ESP8266WiFi模块与Android APP实现数据传输(一)—下位机硬件配置

以上是关于esp8266 收到上位机发来的信息之后不显示+IPD后的内容的主要内容,如果未能解决你的问题,请参考以下文章

1-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(来看一下怎么样监听网络数据,监听电脑上位机软件的数据)

ESP8266环境监测系统+制作手机App在线实时显示

ESP8266 显示实时天气信息

上位机获取单片机发来的数据并进行检验(完整版,附完整源码)

ESP8266怎么接收另一个ESP8266用CIPSEND发送的信息呢?用啥模式进行?

上位机获取单片机发来的数据并进行检验