9-51单片机ESP8266学习-AT指令(测试TCP服务器--51单片机程序配置8266,C#TCP客户端发信息给单片机控制小灯的亮灭)

http://www.cnblogs.com/yangfengwu/p/8780182.html

自己都是现做现写,如果想知道最终实现的功能,请看最后

先把源码和资料链接放到这里

链接:https://pan.baidu.com/s/10MxI8-Q33-M_R2WEHqEi1A 密码:j1sz

先说一下哈,不要嫌界面不好看,自己是为了程序尽量的简单,可以通过调整颜色或者通过重绘来使使界面好看,,,,,,,,咱先学会走.....

因为咱们会用到图片所以先把图片资源加载上来,为了

 调整的好看一点

现在设置,切换图片

其实呢导入图片应该先建一个资源文件更合理,后期再说

现在是让按钮状态改变了

也修改一下灯的

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

好了,感觉压力还很大...还有好多好多每写的.....................

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏NetCore

ADO.NET 2.0 中的新增 DataSet 功能

ADO.NET 2.0 中的新增 DataSet 功能 发布日期: 1/13/2005 | 更新日期: 1/13/2005 Jackie Goldstein ...

18910
来自专栏算法修养

PAT 甲级 1019 General Palindromic Number(简单题)

1019. General Palindromic Number (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制...

33610
来自专栏.NET开发那点事

使用Microsoft Fakes进行单元测试(2)

接上一篇使用Microsoft Fakes进行单元测试(1) 下面进行Shim的演示。 2.使用Shim替换静态方法 假设我们需要一个工具方法用来格式化当前时...

2159
来自专栏跟着阿笨一起玩NET

VS2010在C#头文件中添加文件注释的方法

1.VS2010 中找到安装盘符(本人安装目录在D盘,所以以D盘为例)D:\Program Files (x86)\Microsoft Visual Studi...

1071
来自专栏一个爱瞎折腾的程序猿

mvc网站迁移.net core记录

ConfigureServices方法中配置即可,详情见院长文章 http://www.cnblogs.com/dudu/p/5879913.html

1571
来自专栏知识分享

51采集PCF8591数据通过ESP8266上传C#上位机android 之TCP客户端编程ESP8266使用详解NodeMCU初探ESP8266刷AT固件与nodemcu固件ESP8266使用详解-

这两天测试程序还发现一个bug就是如果客户端断开了,应该检测一下哪个断开了,数据就不应该发向那个连接,,,否则就会报错,然后模块会复位重启 所以加上这段代码 c...

5695
来自专栏码农阿宇

.Net Core中利用TPL(任务并行库)构建Pipeline处理Dataflow

在学习的过程中,看一些一线的技术文档很吃力,而且考虑到国内那些技术牛人英语都不差的,要向他们看齐,所以每天下班都在疯狂地背单词,博客有些日子没有更新了,见谅见谅...

2431
来自专栏jeremy的技术点滴

开发小技巧备忘

3387
来自专栏ASP.NET MVC5 后台权限管理系统

ASP.NET MVC5+EF6+EasyUI 后台管理系统(6)-Unity 依赖注入

前言 为了符合后面更新后的重构系统,文章于2016-11-1日重写 本节重构一下代码,采用IOC控制反转,也就是依赖注入 您可以访问http://unit...

2747
来自专栏码农阿宇

.Net Core中利用TPL(任务并行库)构建Pipeline处理Dataflow

在学习的过程中,看一些一线的技术文档很吃力,而且考虑到国内那些技术牛人英语都不差的,要向他们看齐,所以每天下班都在疯狂地背单词,博客有些日子没有更新了,见谅见谅...

1051

扫码关注云+社区

领取腾讯云代金券