7-51单片机ESP8266学习-AT指令(8266TCP服务器,编写自己的C#TCP客户端发信息给单片机控制小灯的亮灭)
http://www.cnblogs.com/yangfengwu/p/8780182.html
自己都是现做现写,如果想知道最终实现的功能,请看最后
先把源码和资料链接放到这里
链接: https://pan.baidu.com/s/1jpHZjW_7pQKNfN9G4B6ZjA 密码:nhn3
先说一下哈,不要嫌界面不好看,自己是为了程序尽量的简单,可以通过调整颜色或者通过重绘来使使界面好看,,,,,,,,咱先学会走.....
因为咱们会用到图片所以先把图片资源加载上来,为了
调整的好看一点
现在设置,切换图片
其实呢导入图片应该先建一个资源文件更合理,后期再说
现在是让按钮状态改变了
也修改一下灯的
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 = 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 = 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