APP通过ESP8266与单片机通信

简述

本项目中是用ESP8266作为热点,工作在MODE2模式,手机作为station接入ESP8266的网络进行数据传输,同时,ESP8266与52单片机之间通过串口进行数据传输。
本项目中只需要APP向WIFI发送数据,所以在APP的程序中没有接收WIFI数据的程序。在文章最后,则是笔者在写代码的过程中遇到的一个问题,51单片机不能接收WIFI数据,但能向WIFI发送AT指令的问题。

手机端实现

建立连接线程

以下为APP与ESP8266建立连接的线程,建立连接时只要获取其对象即可。其中的IP和port为ESP8266的IP地址和端口号,IP一般默认为192.168.0.1,端口号默认为8080,端口号可以自己设置。

private class ConnectThred extends  Thread{private  String ip;private  int port;public ConnectThred(String ip,int port){this.ip = ip;this.port = port;}public void run(){//接收数据可用子线程也可直接在此线程操作char[] buffer=new char[256];//定义数组接收输入流数据String bufferString="";//定义一个字符接收数组数据int conut =0;//初始化buffer数组长度为0int tag=0;//初时写入数组的位置try {//建立连接socket = new Socket(ip,port);runOnUiThread(new Runnable() {@Overridepublic void run() {Log.d("Controler","runOnUI");bt_link.setText("断开连接");bt_link.setBackgroundColor(Color.GREEN);Toast.makeText(Controler.this,"连接成功",Toast.LENGTH_LONG).show();}});//读取输入流bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));//获取输出流OutputStream=socket.getOutputStream();//获取socket的输出流,接收数据InputStream = socket.getInputStream();while (true) {//当输入流写入buffer数组的长度大于0时即接收到数据时while ((conut=bufferedReader.read(buffer))>0) {//将buffer数组的数据全部写入bufferString字符类型while ( tag<buffer.length) {bufferString=bufferString+buffer[tag];tag++;}//将数据给messageHandler刷新UI界面Message msgMessage =new Message();msgMessage.obj=bufferString;msgMessage.what=1;messageHandler.sendMessage(msgMessage);//初始化数据,以便处理下一条输入流信息tag=0;bufferString="";}}} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(Controler.this,"连接错误",Toast.LENGTH_LONG).show();}});}}}

发送数据线程

以下是APP向ESP8266发送数据的代码,同样在一个子线程中执行。需要发送数据时通过对象调用此方法即可。

 //向服务器发送数据子程序public class Send extends Thread{public void run(){if(socket != null){try{if (msg_send != null && msg_send.length()>0){OutputStream.write(msg_send.getBytes("utf-8"));OutputStream.flush();msg_send="";}else{Looper.prepare();Toast.makeText(Controler.this,"发送的数据不能为空",Toast.LENGTH_LONG).show();Looper.loop();}}catch (IOException e){e.printStackTrace();}}}}

通过按钮建立或断开连接

定义相关变量

private static final String IP = "192.168.4.1";//服务端IPprivate static final int PORT = 8080;         //端口号Socket socket;     //创建一个socketBoolean IsConnected = false;       //连接标志ConnectThred mConnectThread;  //TCP连接线程//输入输出流OutputStream OutputStream = null;//数据输出流,发送数据BufferedReader bufferedReader;//声明输入流对象InputStream InputStream = null;//定义数据输入流,用于接收数据

通过按钮实现连接:

 bt_link.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {  //连接按钮,点击与ESP8266芯片连接或断开if (socket ==null || !socket.isConnected()){mConnectThread = new ConnectThred(IP,PORT);mConnectThread.start();}if (socket!=null && socket.isConnected()){try {socket.close();socket = null;bt_link.setText("点击连接");bt_link.setBackgroundColor(Color.GRAY);Toast.makeText(Controler.this,"连接已断开",Toast.LENGTH_LONG).show();}catch (IOException e){e.printStackTrace();}}}});

通过按钮发送数据:
通过new一个发送数据线程的对象,调用start方法启动发送数据线程即可发送数据。

select_mode.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {mode_count++;if (mode_count > 4)mode_count=0;mode = mode_arr[mode_count];msg_send = "mod"+Integer.toString(mode_count)+"/n";new Send().start();tempmode.setText(mode);                   //设置模式}});

下位机端接收WIFI数据

下位机端使用51单片机实现,下位机端与ESP8266之间通过串口进行通信,传输数据。所以下位机接收WIFI数据时使用的是串口接收程序。

void UartConfiguration()
{TMOD=0x20;      // 设置计数器1工作模式2TH1=0xfd;          //计数器1初值TL1=0xfd;          //计数器1初值  两个初值决定波特率,此处设置波特率9600PCON=0x00;      //波特率倍增0x00不加倍,0x80加倍SCON=0x50;      // EA=1;           //ES=1;            //TR1=1;           //TI=1;
}

将接收到的数据存入一个数组中然后进行处理

void ESP_UART() interrupt 4
{static uchar i=0;
//  led1=~led1;if(RI==1){RI=0;       //½ÓÊÕ±êÖ¾Recive_table[i]=SBUF;sendByte(Recive_table[i]);   i++;         if((Recive_table[i-1]=='\n')){Recive_table[i]='\0';i=0; }}elseTI=0;
}

处理接收到的数据

void getData()
{if(Recive_table[0]=="+")sendString(Recive_table);if((Recive_table[0]=='+')&&(Recive_table[1]=='I')&&(Recive_table[2]=='P')){if((Recive_table[3]=='D')&&(Recive_table[6]==',')){   if(Recive_table[9]=='0')//&& Recive_table[10]=='0'     //{Shutdown();}else if(Recive_table[9]=='1')//&& Recive_table[10]=='1'   //{MakeNum(Recive_table[10],Recive_table[11]);Startup();}else if(Recive_table[9]=='d')//&& Recive_table[10]=='1'   //{MakeNum(Recive_table[10],Recive_table[11]);}else if(Recive_table[9]=='e')//&& Recive_table[10]=='1'   //{MakeNum(Recive_table[10],Recive_table[11]);}else if(Recive_table[9]=='o'&& Recive_table[10]=='d')    //{m_index=Recive_table[11]-'0';SetMode(m_index);}else if(Recive_table[9]=='f')//&& Recive_table[10]=='1'   //{SetSweep(Recive_table[10]-'0');}else if(Recive_table[9]=='p')//&& Recive_table[10]=='1'   //{SetSpeed(Recive_table[10]-'0');}else if(Recive_table[9]=='i')//&& Recive_table[10]=='1'   //{SetDirect(Recive_table[10]-'0');}memset(Recive_table,0,50);}   }
}

注意

当ESP8266与51单片机通信时,51单片机不能使用CH340芯片进行串口数据的传输,不然会出现ESP8266发送的数据51单片机接收不到的情况。

APP同过ESP8266与51单片机通信相关推荐

  1. esp8266与51单片机通信(看完不会你打我)用手机控制led灯的亮灭

    第一步:所需材料: 我录制了关于此课程的视频,在b站,大家可以前往b站观看视频bandicam 2022-05-16 11-45-49-495_哔哩哔哩_bilibili 既然你刷到我这篇学习总结了 ...

  2. 基于ESP8266和51单片机的手机遥控小车

    小车效果 APP效果 设计材料 ESP8266-01s模块. 51单片机最小系统板. L293D芯片一个. Android系统手机. 面包板一块. 充电宝一个,当做电源. 杜邦线若干. 设计思路 说明 ...

  3. ESP8266wifi模块与51单片机通信教程

    ** ESP8266wifi模块与51单片机通信教程 准备两个200欧左右的电阻 准备6根杜邦线 然后将ES8266通过如图这种方式连接起来 注意:必须先配置ESP8266模块,配置需要用到ESP82 ...

  4. 基于ESP8266与51单片机的震动报警器(车辆报警器)(简单向)

    基于ESP8266与51单片机的震动报警器(车辆报警器) 前言 笔者是桂工通信工程的一名在读大学生,在进行课程设计的时候,想要去做一个可以在手机上进行消息提醒的报警器.在传统的声光报警器上有所突破,可 ...

  5. nRF24L01--2.4G无线通信模块(1)(51单片机和51单片机通信)

    作者:李剀 出处:https://www.cnblogs.com/kevin-nancy/ 或者 https://blog.csdn.net/Kevin_8_Lee/article/details/9 ...

  6. 4g模块与51单片机通信

    本文硬件选自忆佰特的4g模块和老陈的上官一号 第一步先使用电脑配置4g模块,配置好后再与51单片机进行接线完成通信,需要提前插入SIM卡,接线如下 通电后模块右下角会亮起红灯,并且右上角四颗lcd灯会 ...

  7. 利用ESP8266-12F实现与51单片机通信及温湿度传感器数据交互

    文章目录 前言 一.ESP8266是什么? 二.使用步骤 1.将keil5生成的hex文件,下载到stc89c52单片机中 2.打开stc-isp内部自带的串口助手 3.利用AT指令集进行配网 4.手 ...

  8. 树莓派和51单片机通信问题解决

    1.关于树莓派的通信,网上教程也是很多的,我们都知道发的数据是bytes类型的二进制数据,到51板接收是需要数据类型转换的然后进行判断,如果没有led显示屏会比较麻烦. 2.树莓派部分查看这个教程就行 ...

  9. 基于51单片机与ESP8266的智能台灯设计

    一.硬件设计 1. 硬件选型 主控芯片:选用STC89C52RC,单片机通过串口与EPS866模块通信. LDO: 选用AMS1117-3.3V,ESP8266模块需要使用3.3V电源,使用1117- ...

最新文章

  1. 使用bootstrap-table等自动使用ajax地址载入数据的插件的数据设计建议
  2. 【Leetcode】创建二叉树
  3. [渝粤教育] 四川农业大学 宏观经济学 参考 资料
  4. android 弹出弹框2秒消失_基于HTML5 Canvas 实现弹出框
  5. 找回华为云删除的通讯录_找回小米手机误删照片只要10秒!人人都知道的方法,你怎能不知道...
  6. maven更新总结与tomcat发布方法总结
  7. SQL Server数据库导入导出数据方式比较
  8. jvm 参数_JVM快速调优手册之六:JVM参数设置及分析
  9. Pygame实现”走四棋儿“双人对战小游戏
  10. ubuntu 10.04 下安装 wine 所得所获【转】
  11. Unity 之 发布 WebGl 遇到的问题
  12. 十大算法简单介绍以及例题
  13. DZZOffice(大桌子)企业文档协同平台教程系列(三)——ONLYOFFICE社区版部署、配置
  14. python自动控制程序_使用 Python 自动执行 ANSYS APDL
  15. github上的python项目 运行,12月Github上热门的Python开源项目
  16. 自适应图片九宫格 css,CSS实现自适应九宫格布局 大全
  17. 一、Java基础入门
  18. MySQL导入数据库1118错误解决方案[ERR] 1118 - Row size too large (> 8126). Changing some columns to TEXT or BLOB
  19. [学位论文写作] 将一级标题数字1改为“第一章”
  20. FCPX怎么导入LUT调色预设,fcpx导入lut预设详细教程

热门文章

  1. 数据库存储图片解决方案
  2. 基于环信视频语音通话功能
  3. FM信号、调制信号和载波
  4. 源创媒:创建百科词条有什么注意事项?
  5. 百度一键Root使用教程
  6. 电脑格式化后文件还能恢复吗?好用方法分享
  7. 计算机课会点名吗,网课突然被点名的尴尬,你也懂的吧
  8. base cap 分布式_简单理解CAP-BASE
  9. 优化用电,安全省心,同为(TOWE)智能循环定时桌面PDU插座APZ-1013DX
  10. 图片文字怎么转换成Word文档?教你两招快速解决