• ESP8266 SDK开发: 综合篇-C#上位机串口通信控制ESP8266


    实现的功能

    1.C#串口上位机通过串口控制继电器

    控制继电器吸合

        

    控制继电器断开

        

     

    说明

    1,请用户先学习这一节

    https://www.cnblogs.com/yangfengwu/p/12382103.html   编写C#串口调试助手

    2.控制继电器引脚

    协议规定

     

    上位机串口发送给ESP8266控制继电器吸合指令:

    0xaa  0x55  0x01 0x01

    ESP8266执行以后回复:

    0x55  0xaa  0x01 0x01

    上位机串口发送给ESP8266控制继电器断开指令:

    0xaa  0x55  0x01 0x00

    ESP8266执行以后回复:

    0x55  0xaa  0x01 0x00

    ESP8266程序编写

    1.处理程序在这节的基础上添加

    https://www.cnblogs.com/yangfengwu/p/12375342.html

    2.配置GPIO5为普通引脚

        /*设置GPIO5为普通引脚*/
        PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U , FUNC_GPIO5);

    3.定义用于返回继电器状态的数组

    /*用于返回继电器的状态*/
    u8 RelayOn[4]={0x55,0xaa,0x01,0x01};//继电器吸合
    u8 RelayOff[4]={0x55,0xaa,0x01,0x00};//继电器断开

    4.编写处理程序

                if(Usart0ReadBuff[0] == 0xaa && Usart0ReadBuff[1] == 0x55){
                    if(Usart0ReadBuff[2] == 0x01){
                        if(Usart0ReadBuff[3] == 0x01){
                            GPIO_OUTPUT_SET(5, 1);//设置GPIO5输出高电平
                            for(i=0;i<4;i++){
                                uart_tx_one_char(UART0,RelayOn[i]);//返回吸合指令
                            }
                        }
                        else if(Usart0ReadBuff[3] == 0x00){
                            GPIO_OUTPUT_SET(5, 0);//设置GPIO5输出低电平
                            for(i=0;i<4;i++){
                                uart_tx_one_char(UART0,RelayOff[i]);//返回断开指令
                            }
                        }
                    }
                }

    5.先用串口调试助手测试

    控制继电器吸合

    aa  55  01 01

     

    控制继电器断开

    aa  55  01 00

    C#上位机程序编写

    1.上位机只保留了这一节

    https://www.cnblogs.com/yangfengwu/p/12382103.html

    操作串口部分

    详细保留的程序说明:

    1.串口显示初始化

     

    2.打开关闭串口

    3.串口热插拔检测

    4.串口接收

    开始编写

    1.页面

    两个Label 

    一个按键

    2.双击 吸合按钮 生成按钮点击事件

    并在点击事件中编写以下程序

                byte[] SendData = new byte[4];
                SendData[0] = 0xaa;
                SendData[1] = 0x55;
                SendData[2] = 0x01;
                SendData[3] = 0x01;
                if (button2.Text == "吸合")
                {
                    SendData[3] = 0x01;
                }
                else if (button2.Text == "断开")
                {
                    SendData[3] = 0x00;
                }
                try
                {
                    serialPort1.Write(SendData, 0, SendData.Length);
                }
                catch (Exception) { }

    3.编写串口接收处理程序

    处理思路: https://www.cnblogs.com/yangfengwu/p/11669373.html

    3.1.拖拽上来一个定时器

    3.2配置定时器

    Enable改为True  (使能定时器)

    Interval 设置为1  (1Ms进一次)

    3.3 

    选择事件 -> 双击Tick 

    让程序生成定时器回调函数

    3.4 定义用于处理串口数据的变量

            byte[] UsartReadBuff = new byte[1024];//接收数据缓存
            int UsartReadCnt = 0;//串口接收的数据个数
            int UsartReadCntCopy = 0;//用于拷贝串口接收的数据个数
            int UsartIdleCnt = 0;//空闲时间累加变量

    3.5 串口中断函数中处理程序如下

                int len = serialPort1.BytesToRead;//获取可以读取的字节数
                if ((UsartReadCnt + len) < 1024)//待接收的数据不得超出数组大小
                {
                    //把数据读取到UsartReadBuff数组,每次接收数据偏移UsartReadCnt
                    serialPort1.Read(UsartReadBuff, UsartReadCnt, len);
                    UsartReadCnt = UsartReadCnt + len;
                }
                else
                {
                    UsartReadCnt = 0;
                }

    3.6 定时器中断函数程序如下

                if (UsartReadCnt!=0)//串口接收到数据
                {
                    UsartIdleCnt++;//空闲变量累加
                    if (UsartIdleCnt > 10)//串口超过10ms没有接收数据
                    {
                        UsartIdleCnt = 0;
                        UsartReadCntCopy = UsartReadCnt;
                        UsartReadCnt = 0;
    
                        if (UsartReadBuff[0] == 0x55 && UsartReadBuff[1] == 0xaa)
                        {
                            if (UsartReadBuff[2] == 0x01)
                            {
                                if (UsartReadBuff[3] == 0x01)//继电器吸合
                                {
                                    Invoke((new Action(() => {//C# 3.0以后代替委托的新方法
                                        label8.Text = "吸合";
                                        button2.Text = "断开";
                                    })));
                                }
                                else if (UsartReadBuff[3] == 0x00)//继电器断开
                                {
                                    label8.Text = "断开";
                                    button2.Text = "吸合";
                                }
                            }
                        }
                    }
                }

    启动测试

    1.控制继电器吸合

        

    2.控制继电器断开

        

  • 相关阅读:
    模板库
    LCT小结
    BZOJ1502: [NOI2005]月下柠檬树
    技术资料分享
    ORM介紹及ORM優點、缺點
    依賴注入入門——Unity(二)
    面向切面編程入門(一)
    依賴注入入門——Unity(一)
    WCF、.Net Remoting、Web Service概念及区别
    深入设计模式(四)——建造者模式
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/12386915.html
Copyright © 2020-2023  润新知