7-51单片机ESP8266学习-AT指令(8266TCP服务器|7-51单片机ESP8266学习-AT指令(8266TCP服务器,编写自己的C#TCP客户端发信息给单片机控制小灯的亮灭)...
http://www.cnblogs.com/yangfengwu/p/8780182.html
自己都是现做现写,如果想知道最终实现的功能,请看最后
先把源码和资料链接放到这里
链接: https://pan.baidu.com/s/1jpHZjW_7pQKNfN9G4B6ZjA密码:nhn3
先说一下哈,不要嫌界面不好看,自己是为了程序尽量的简单,可以通过调整颜色或者通过重绘来使使界面好看,,,,,,,,咱先学会走.....
文章图片
因为咱们会用到图片所以先把图片资源加载上来,为了
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
【7-51单片机ESP8266学习-AT指令(8266TCP服务器|7-51单片机ESP8266学习-AT指令(8266TCP服务器,编写自己的C#TCP客户端发信息给单片机控制小灯的亮灭)...】
调整的好看一点
文章图片
文章图片
现在设置,切换图片
文章图片
文章图片
文章图片
其实呢导入图片应该先建一个资源文件更合理,后期再说
现在是让按钮状态改变了
文章图片
文章图片
也修改一下灯的
文章图片
private void pictureBox2_Click(object sender, EventArgs e) { if (LedFlage == false) { LedFlage = true; pictureBox2.BackgroundImage = Properties.Resources.switchon; pictureBox3.BackgroundImage = Properties.Resources.ledon; } else { LedFlage = false; pictureBox2.BackgroundImage = Properties.Resources.switchoff; pictureBox3.BackgroundImage = Properties.Resources.ledoff; } }
文章图片
现在做连接服务器
先说一下很多初学者会遇到的问题
文章图片
这种情况是你添加了控件的事件函数,然后你又删除了,,,因为我也是经常删.................
文章图片
我刚才在考虑要不要用委托和回调.....后来想了想这篇就不用了,
大家记得自己试一下这个(反正给大家说了,下次自己肯定用委托和回调写,记住不要偷懒,如果你偷懒了,后期的文章你就会无从下手,因为你连基础的都不知道)
http://www.cnblogs.com/yangfengwu/p/5761841.html
因为和android 一样只有主线程才允许操作控件,咱们就
文章图片
现在做连接服务器和断开连接
先在电脑上测试
文章图片
文章图片
文章图片
文章图片
先给现在的程序
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace TCPClient { public partial class Form1 : Form { bool LedFlage = false; bool ConncetFlage = false; private Thread ThreadConnectService; //连接服务器线程 private IPAddress ipAddress; //ip地址 int Port = 0; //端口号 private TcpClient myTcpClient = null; // TcpClient private NetworkStream networkstrem = null; //网络数据流public Form1() { InitializeComponent(); }private void Form1_Load(object sender, EventArgs e) { System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false; //加了这一句}/*连接按钮点击事件*/ private void button1_Click(object sender, EventArgs e) { if (ConncetFlage == false) { try{ThreadConnectService.Abort(); }//先清除一下以前的 catch (Exception){} ThreadConnectService = new Thread(ConncetService); //把连接服务器的函数加入任务 ThreadConnectService.Start(); //启动任务 } else { ConncetFlage = false; button1.Text = "连接"; pictureBox1.BackgroundImage = Properties.Resources.lightoff; try{myTcpClient.Close(); }catch (Exception){}//关闭通道 } }/*LED灯控制按钮(图片)*/ private void pictureBox2_Click(object sender, EventArgs e) { if (LedFlage == false) { LedFlage = true; pictureBox2.BackgroundImage = Properties.Resources.switchon; pictureBox3.BackgroundImage = Properties.Resources.ledon; } else { LedFlage = false; pictureBox2.BackgroundImage = Properties.Resources.switchoff; pictureBox3.BackgroundImage = Properties.Resources.ledoff; } }/*连接服务器函数*/ private void ConncetService() { ipAddress = IPAddress.Parse(textBox1.Text); //获取IP地址 Port = Convert.ToInt32(textBox2.Text); //获取端口号try { myTcpClient = new TcpClient(); //实例化myTcpClient myTcpClient.Connect(ipAddress, Port); //连接服务器 ConncetFlage = true; button1.Text = "断开"; pictureBox1.BackgroundImage = Properties.Resources.lighton; } catch (Exception) { ConncetFlage = false; button1.Text = "连接"; pictureBox1.BackgroundImage = Properties.Resources.lightoff; try { myTcpClient.Close(); } catch (Exception) { } } }} }
文章图片
断开
文章图片
忘了加一个功能,,,判断服务器是不是断开了
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace TCPClient { public partial class Form1 : Form { bool LedFlage = false; bool ConncetFlage = false; private Thread ThreadConnectService; //连接服务器线程 private IPAddress ipAddress; //ip地址 int Port = 0; //端口号 private TcpClient myTcpClient = null; // TcpClient private NetworkStream networkstrem = null; //网络数据流private Thread ThreadReadData; //接收消息线程 private bool ThreadReadDataFlage = false; //接收数据任务循环用byte[] ReadBuffer = new byte[1024]; //设置缓冲区1024个字节 int ReadCnt = 0; //获取接收到了几个字节public Form1() { InitializeComponent(); }private void Form1_Load(object sender, EventArgs e) { System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false; //加了这一句}/*连接按钮点击事件*/ private void button1_Click(object sender, EventArgs e) { if (ConncetFlage == false) { try{ThreadConnectService.Abort(); }//先清除一下以前的 catch (Exception){} ThreadConnectService = new Thread(ConncetService); //把连接服务器的函数加入任务 ThreadConnectService.Start(); //启动任务 } else { ConncetFlage = false; ThreadReadDataFlage = false; button1.Text = "连接"; pictureBox1.BackgroundImage = Properties.Resources.lightoff; try{myTcpClient.Close(); }catch (Exception){}//关闭通道 } }/*LED灯控制按钮(图片)*/ private void pictureBox2_Click(object sender, EventArgs e) { if (LedFlage == false) { LedFlage = true; pictureBox2.BackgroundImage = Properties.Resources.switchon; pictureBox3.BackgroundImage = Properties.Resources.ledon; } else { LedFlage = false; pictureBox2.BackgroundImage = Properties.Resources.switchoff; pictureBox3.BackgroundImage = Properties.Resources.ledoff; } }/*连接服务器函数*/ private void ConncetService() { ipAddress = IPAddress.Parse(textBox1.Text); //获取IP地址 Port = Convert.ToInt32(textBox2.Text); //获取端口号try { myTcpClient = new TcpClient(); //实例化myTcpClient myTcpClient.Connect(ipAddress, Port); //连接服务器 ConncetFlage = true; button1.Text = "断开"; pictureBox1.BackgroundImage = Properties.Resources.lighton; networkstrem = myTcpClient.GetStream(); //获取数据流ThreadReadDataFlage = true; try { ThreadReadData.Abort(); }//先清除一下以前的 catch (Exception) { } ThreadReadData = https://www.it610.com/article/new Thread(ReadData); //把接收数据的函数加入任务 ThreadReadData.Start(); } catch (Exception) { ConncetFlage = false; ThreadReadDataFlage = false; button1.Text ="连接"; pictureBox1.BackgroundImage = Properties.Resources.lightoff; try { myTcpClient.Close(); } catch (Exception) { } } }/*接收消息函数*/ private void ReadData() { while (ThreadReadDataFlage) { try { ReadCnt = networkstrem.Read(ReadBuffer, 0, ReadBuffer.Length); //读取数据 if (ReadCnt != 0)//有数据 {} else//异常断开 { ConncetFlage = false; ThreadReadDataFlage = false; button1.Text = "连接"; pictureBox1.BackgroundImage = Properties.Resources.lightoff; try { myTcpClient.Close(); } catch (Exception) { } } } catch (Exception) { ThreadReadDataFlage = false; } } } } }
文章图片
文章图片
文章图片
现在做数据发送部分,和APP那块几乎是一个模子刻出来的
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace TCPClient { public partial class Form1 : Form { bool LedFlage = false; bool ConncetFlage = false; private Thread ThreadConnectService; //连接服务器线程 private IPAddress ipAddress; //ip地址 int Port = 0; //端口号 private TcpClient myTcpClient = null; // TcpClient private NetworkStream networkstrem = null; //网络数据流private Thread ThreadReadData; //接收消息线程 private bool ThreadReadDataFlage = false; //接收数据任务循环用private Thread ThreadSendData; //发送消息线程 private bool ThreadSendDataFlage = false; //发送数据任务循环用byte[] ReadBuffer = new byte[1024]; //设置缓冲区1024个字节 int ReadCnt = 0; //获取接收到了几个字节byte[] SendBuffer = new byte[1024]; //设置发送缓冲区1024个字节 int SendCnt = 0; //发送的个数public Form1() { InitializeComponent(); }private void Form1_Load(object sender, EventArgs e) { System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false; //加了这一句}/*连接按钮点击事件*/ private void button1_Click(object sender, EventArgs e) { if (ConncetFlage == false) { try{ThreadConnectService.Abort(); }//先清除一下以前的 catch (Exception){} ThreadConnectService = new Thread(ConncetService); //把连接服务器的函数加入任务 ThreadConnectService.Start(); //启动任务 } else { ConncetFlage = false; ThreadReadDataFlage = false; ThreadSendDataFlage = false; button1.Text = "连接"; pictureBox1.BackgroundImage = Properties.Resources.lightoff; try{myTcpClient.Close(); }catch (Exception){}//关闭通道 } }/*LED灯控制按钮(图片)*/ private void pictureBox2_Click(object sender, EventArgs e) { if (LedFlage == false) { SendBuffer[0] = 0xaa; SendBuffer[1] = 0x55; SendBuffer[2] = 0x02; SendBuffer[3] = 0xff; SendCnt = 4; LedFlage = true; pictureBox2.BackgroundImage = Properties.Resources.switchon; pictureBox3.BackgroundImage = Properties.Resources.ledon; } else { SendBuffer[0] = 0xaa; SendBuffer[1] = 0x55; SendBuffer[2] = 0x02; SendBuffer[3] = 0x00; SendCnt = 4; LedFlage = false; pictureBox2.BackgroundImage = Properties.Resources.switchoff; pictureBox3.BackgroundImage = Properties.Resources.ledoff; } }/*连接服务器函数*/ private void ConncetService() { ipAddress = IPAddress.Parse(textBox1.Text); //获取IP地址 Port = Convert.ToInt32(textBox2.Text); //获取端口号try { myTcpClient = new TcpClient(); //实例化myTcpClient myTcpClient.Connect(ipAddress, Port); //连接服务器 ConncetFlage = true; button1.Text = "断开"; pictureBox1.BackgroundImage = Properties.Resources.lighton; networkstrem = myTcpClient.GetStream(); //获取数据流/*接收消息任务*/ ThreadReadDataFlage = true; try { ThreadReadData.Abort(); }//先清除一下以前的 catch (Exception) { } ThreadReadData = https://www.it610.com/article/new Thread(ReadData); //把接收数据的函数加入任务 ThreadReadData.Start(); /*发送消息任务*/ ThreadSendDataFlage = true; try { ThreadSendData.Abort(); }//先清除一下以前的 catch (Exception) { } ThreadSendData = new Thread(SendData); ThreadSendData.Start(); } catch (Exception) { ConncetFlage = false; ThreadReadDataFlage = false; ThreadSendDataFlage = false; button1.Text ="连接"; pictureBox1.BackgroundImage = Properties.Resources.lightoff; try { myTcpClient.Close(); } catch (Exception) { } } }/*接收消息函数*/ private void ReadData() { while (ThreadReadDataFlage) { try { ReadCnt = networkstrem.Read(ReadBuffer, 0, ReadBuffer.Length); //读取数据 if (ReadCnt != 0)//有数据 {} else//异常断开 { ConncetFlage = false; ThreadReadDataFlage = false; ThreadSendDataFlage = false; button1.Text = "连接"; pictureBox1.BackgroundImage = Properties.Resources.lightoff; try { myTcpClient.Close(); } catch (Exception) { } } } catch (Exception) { ThreadReadDataFlage = false; } } }/*发送消息函数*/ private void SendData() { while (ThreadSendDataFlage) { try { if (SendCnt>0) { networkstrem.Write(SendBuffer, 0, SendCnt); SendCnt = 0; } } catch (Exception) { ConncetFlage = false; ThreadReadDataFlage = false; ThreadSendDataFlage = false; button1.Text = "连接"; pictureBox1.BackgroundImage = Properties.Resources.lightoff; try { myTcpClient.Close(); } catch (Exception) { } } } }} }
文章图片
文章图片
现在用调试助手试一下
文章图片
文章图片
文章图片
好了咱现在用8266试一试
文章图片
文章图片
文章图片
文章图片
C#的源码
文章图片
文章图片
好了.....但是刚才我在软件连接的时候复位了一下芯片发现软件没有检测出来断开..现在如果服务器主动断开
可以检测的到,异常好像不可以,后期再看看....今天太晚了写的匆忙,不知道软件还有没有其它的Bug,慢慢的去发现吧...
突然有想起来单片机程序有个BUG
http://www.cnblogs.com/yangfengwu/p/8798512.html
推荐阅读
- 单片机|单片机初学者做项目为什么这么难(单片机初学者心得有哪些)
- 单片机|自学单片机好找工作吗(会单片机能找什么工作?)
- 单片机|keil把源代码生成lib的方法
- c语言|一文搞懂栈(stack)、堆(heap)、单片机裸机内存管理malloc
- 单片机|Arduino、arm、树莓派、单片机四者有什么不同()
- LUA|单片机脚本语言移植lua到stm32MDK
- Android|Android 应用与HC-06蓝牙单片机控制LED灯(下)
- 安卓基于蓝牙控制单片机与数据传输——目录
- 单片机生成二维码|单片机生成二维码 C语言代码
- 灵动微MM32F0130国产32位单片机电子货架标签应用案例参考