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 = ;//端口号
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 = ;//端口号
private TcpClient myTcpClient = null;// TcpClient
private NetworkStream networkstrem = null;//网络数据流 private Thread ThreadReadData;//接收消息线程
private bool ThreadReadDataFlage = false;//接收数据任务循环用 byte[] ReadBuffer = new byte[];//设置缓冲区1024个字节
int ReadCnt = ;//获取接收到了几个字节 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, , ReadBuffer.Length);//读取数据
if (ReadCnt != )//有数据
{ }
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 = ;//端口号
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个字节
int ReadCnt = ;//获取接收到了几个字节 byte[] SendBuffer = new byte[];//设置发送缓冲区1024个字节
int SendCnt = ;//发送的个数 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[] = 0xaa;
SendBuffer[] = 0x55;
SendBuffer[] = 0x02;
SendBuffer[] = 0xff;
SendCnt = ; LedFlage = true;
pictureBox2.BackgroundImage = Properties.Resources.switchon;
pictureBox3.BackgroundImage = Properties.Resources.ledon;
}
else
{
SendBuffer[] = 0xaa;
SendBuffer[] = 0x55;
SendBuffer[] = 0x02;
SendBuffer[] = 0x00;
SendCnt = ; 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, , ReadBuffer.Length);//读取数据
if (ReadCnt != )//有数据
{ }
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>)
{
networkstrem.Write(SendBuffer, , SendCnt);
SendCnt = ;
}
}
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
7-51单片机ESP8266学习-AT指令(8266TCP服务器,编写自己的C#TCP客户端发信息给单片机控制小灯的亮灭)的更多相关文章
- 5-51单片机ESP8266学习-AT指令(8266TCP服务器--用手机TCP调试助手发信息给单片机控制小灯的亮灭)
http://www.cnblogs.com/yangfengwu/p/8759294.html 源码链接:https://pan.baidu.com/s/1wT8KAOIzvkOXXNpkDI7E8 ...
- 6-51单片机ESP8266学习-AT指令(8266TCP服务器--做自己的AndroidTCP客户端发信息给单片机控制小灯的亮灭)
http://www.cnblogs.com/yangfengwu/p/8776712.html 先把源码和资料链接放到这里 链接: https://pan.baidu.com/s/1jpHZjW_7 ...
- 8-51单片机ESP8266学习-AT指令(单片机采集温湿度数据通过8266发送给C#TCP客户端显示)
http://www.cnblogs.com/yangfengwu/p/8785516.html 先写单片机端的程序 先把源码和资料链接放到这里 链接: https://pan.baidu.com/s ...
- 10-51单片机ESP8266学习-AT指令(ESP8266连接路由器,建立TCP服务器,分别和C#TCP客户端和AndroidTCP客户端通信+花生壳远程通信)
http://www.cnblogs.com/yangfengwu/p/8871464.html 先把源码和资料链接放到这里 源码链接:https://pan.baidu.com/s/1wT8KAOI ...
- 1-51单片机ESP8266学习-AT指令(开发板介绍)
51单片机+ESP8266开发教程(AT指令篇) 开发板资源分布: 开发板部分原理图: 1--通信下载 2--51单片机 3--ESP8266(WIFI模块) 4--DHT11(温湿度传感器) 5-- ...
- 9-51单片机ESP8266学习-AT指令(单片机采集温湿度数据通过8266发送给AndroidTCP客户端显示)
http://www.cnblogs.com/yangfengwu/p/8798512.html 补充:今天答应了一个朋友写一下如果单片机发过的是字符串应该怎么解析,答应了今天写,哦哦哦是明天了,闲话 ...
- 2-51单片机ESP8266学习-AT指令(开发板51单片机自动冷启动下载原理)
前言:了解就行,不必深究 上一篇链接 http://www.cnblogs.com/yangfengwu/p/8720148.html 源码链接:https://pan.baidu.com/s/1wT ...
- 12,13,14节-51单片机ESP8266学习-AT指令(暂停更新)需要整理
从这一节开始,以视频加源码的形式,后期视频和程序将放在链接中 资料链接 链接: https://pan.baidu.com/s/1jpHZjW_7pQKNfN9G4B6ZjA 密码:nhn3 ...
- 3-51单片机ESP8266学习-AT指令(学会刷固件)
前言:体验一下刷固件(给单片机更新程序) 上一篇链接 http://www.cnblogs.com/yangfengwu/p/8757036.html 源码链接:https://pan.baidu. ...
随机推荐
- python学习之解决中英文混合输出的排版问题
在python的格式输出时常使用format()方法,其中的多余空间默认使用英文空格作为占位符,不方便中英混合时的格式输出,因此我们要为其中的中文字符串使用占字符较大的中文空格符作为多余空间的占位符. ...
- html一些标签在不同浏览器或者不同版本浏览器的注意事项
最近在IE10下运行一个以前的做web系统发现了两个小问题: 一.图片上使用"alt"属性来添加一些文字提示信息在IE10下无法正常显示出来 上网查了一下原因:原来是现在一 ...
- 【读书笔记】iOS-设计简单的Frenzic式益智游戏
如果你决定用UIView动画或Core Animation,一定要编写一些测试用例,模拟游戏可能遇到的要求最高的动画,另外不要忘记播放声音.不要等到最后才增加声音,因为在iPhone上播放音乐和音效确 ...
- maven 技巧
M2Eclipse Releases maven eclipse插件最新安装地址 Full Version Tag 1.0 2011-06-22 http://download.eclipse.org ...
- OSPF协议总结
总结: 1.ospf协议报文不会泛洪扩散,而是逐级路由器处理后,再从所有ospf启用端口发送出去,也就是说,只能从邻居接收到ospf报文,报文的源ip是邻居的ip地址,目的ip是组播ip. 2.开启o ...
- 安卓开发_startActivityForResult的详细用法
一个需求:一个activity到另一个activity进行一些设置,返回第一个activity的时候 获取第二个activity设置的数据 百度了一下,发现startActivityForResult ...
- maven(四):一个基本maven项目的pom.xml配置
继续之前创建的test项目,一个基本项目的pom.xml文件,通常至少有三个部分 第一部分,项目坐标,信息描述等 <modelVersion>4.0.0</modelVersion& ...
- python第四十二天 socket ---ssh
用scoket 写一个简版的ssh 服务端: #!usr/bin/env python #-*-coding:utf-8-*- # Author calmyan import socket,os s= ...
- Git永久删除文件和历史记录
目录 Git永久删除文件和历史记录 使用filter-branch 添加到.gitignore文件里并push修改后的repo 清理和回收空间 Git永久删除文件和历史记录 造成你想从git存储库中永 ...
- Github API
Web API web api是网站的一部分,用于与使用非常具体的URL请求特定信息的程序交互,这种请求被称为API调用.请求的数据将以易于处理的格式(如JSON或CSV)返回:依赖于外部数据源的大多 ...