實作的功能
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.控制繼電器斷開