前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ESP8266 SDK开发: 综合篇-C#上位机串口通信控制ESP8266

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

作者头像
杨奉武
发布2020-03-03 16:02:05
1.8K0
发布2020-03-03 16:02:05
举报
文章被收录于专栏:知识分享知识分享

实现的功能

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

控制继电器吸合

控制继电器断开

说明

1,请用户先学习这一节

https://cloud.tencent.com/developer/article/1593405   编写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://cloud.tencent.com/developer/article/1592670

2.配置GPIO5为普通引脚

代码语言:javascript
复制
    /*设置GPIO5为普通引脚*/
    PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U , FUNC_GPIO5);

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

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

4.编写处理程序

代码语言:javascript
复制
            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://cloud.tencent.com/developer/article/1593405

操作串口部分

详细保留的程序说明:

1.串口显示初始化

2.打开关闭串口

3.串口热插拔检测

4.串口接收

开始编写

1.页面

两个Label 

一个按键

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

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

代码语言:javascript
复制
            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://cloud.tencent.com/developer/article/1520554

3.1.拖拽上来一个定时器

3.2配置定时器

Enable改为True  (使能定时器)

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

3.3 

选择事件 -> 双击Tick 

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

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

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

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

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

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

代码语言:javascript
复制
            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.控制继电器断开

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实现的功能
  • 说明
  • 协议规定
  • ESP8266程序编写
  • C#上位机程序编写
  • 开始编写
  • 启动测试
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档