ESP8266 SDK開發: 綜合篇-C#上位機串口通訊控制ESP8266
- 2020 年 3 月 3 日
- 筆記
實現的功能
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.控制繼電器斷開


