­

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