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.控制繼電器斷開

    

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM