论武天地论坛

 找回密码
 立即注册
搜索
查看: 7517|回复: 0

6.01-综合实战篇-C#上位机串口通信控制ESP8266(RTOS 2.2.0)

[复制链接]

58

主题

58

帖子

244

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
244
发表于 2020-10-27 23:29:26 | 显示全部楼层 |阅读模式





实现的功能
1.C#串口上位机通过串口控制继电器



控制继电器吸合
819239-20200301001426757-615598320.png     819239-20200301001436704-1255371691.png


819239-20200301001450762-327634310.png


控制继电器断开
819239-20200301001515408-30539882.png     819239-20200301001522673-514449469.png




819239-20200301001534718-1149150607.png




说明
1,请用户先学习这一节


2.控制继电器引脚
819239-20200229230229812-1392698145.png






协议规定
上位机串口发送给ESP8266控制继电器吸合指令:
0xaa  0x55  0x01 0x01
ESP8266执行以后回复:
0x55  0xaa  0x01 0x01


上位机串口发送给ESP8266控制继电器断开指令:
0xaa  0x55  0x01 0x00
ESP8266执行以后回复:
0x55  0xaa  0x01 0x00



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


2.配置GPIO5为普通引脚
819239-20200229230310097-836402344.png




    /*设置GPIO5为普通引脚*/


    PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U , FUNC_GPIO5);


3.定义用于返回继电器状态的数组
819239-20200229230355483-1398797226.png


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


4.编写处理程序
819239-20200229230453686-1724787763.png




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);//返回吸合指令
                        }
                    }
                    else if(Usart0ReadBuff[3] == 0x00){
                        GPIO_OUTPUT_SET(5, 0);//设置GPIO5输出低电平
                        for(i=0;i<4;i++){
                            uart_tx_one_char(UART0,RelayOff);//返回断开指令
                        }
                    }
                }
            }


5.先用串口调试助手测试
819239-20200229230717265-317167097.png


控制继电器吸合

aa  55  01 01

819239-20200229231016840-71343371.png


819239-20200229230953550-1460953591.png





控制继电器断开
aa  55  01 00

819239-20200229231108136-325518266.png



819239-20200229231129284-1649167705.png




C#上位机程序编写
1.上位机只保留了这一节

操作串口部分
819239-20200229231746385-397849548.png




详细保留的程序说明:
1.串口显示初始化
819239-20200229232333261-780953303.png







2.打开关闭串口
819239-20200229232318564-1947796583.png




3.串口热插拔检测
819239-20200229232403034-1853938505.png




4.串口接收
819239-20200229232455570-608224087.png

开始编写
1.页面
两个Label
一个按键

819239-20200229233223634-2102615384.png




2.双击 吸合按钮 生成按钮点击事件
并在点击事件中编写以下程序
819239-20200301000705828-2056312352.png


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.编写串口接收处理程序


3.1.拖拽上来一个定时器
819239-20200229234711783-1258231428.png




3.2配置定时器
Enable改为True  (使能定时器)
Interval 设置为1  (1Ms进一次)


819239-20200229234811319-664519095.png






3.3
选择事件 -> 双击Tick
让程序生成定时器回调函数
819239-20200229235111304-1730769452.png




819239-20200301000948070-1221769921.png





3.4 定义用于处理串口数据的变量
819239-20200301000900568-1152215940.png



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


3.5 串口中断函数中处理程序如下
819239-20200301001106653-1807803448.png


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


3.6 定时器中断函数程序如下
819239-20200301001245673-1437683623.png



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.控制继电器断开
   







copycode.gif
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|论武天地论坛

GMT+8, 2024-11-25 21:31 , Processed in 0.094188 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表