實現的功能
C#TCP客戶端連接8266的TCP服務器,網絡控制開發板繼電器
1.控制繼電器吸合



2.控制繼電器斷開



前言
1.用戶在看這一節之前請先學習
https://www.cnblogs.com/yangfengwu/p/12397146.html C# TCP客戶端
https://www.cnblogs.com/yangfengwu/p/12393478.html 8266 TCP服務器
2.控制繼電器引腳

協議規定
C#TCP客戶端發送給ESP8266TCP服務器控制繼電器吸合指令:
0xaa 0x55 0x01 0x01
ESP8266執行以后回復給C#TCP客戶端:
0x55 0xaa 0x01 0x01
C#TCP客戶端發送給ESP8266TCP服務器控制繼電器斷開指令:
0xaa 0x55 0x01 0x00
ESP8266執行以后回復給C#TCP客戶端:
0x55 0xaa 0x01 0x00
ESP8266程序編寫
1.處理程序在這節的基礎上修改添加
https://www.cnblogs.com/yangfengwu/p/12393478.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.編寫TCP接收處理程序

/** * @brief TCP接收數據 * @param arg:tcp_arg函數傳入的參數 * * @param p:接收的數據緩存 * @param err:錯誤信息 * @param None * @retval None * @warning None * @example **/ static err_t net_tcp_recv_cb(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err) { struct pbuf *q; u32 length = 0,i=0; tcp_pcb_server = tpcb; tcp_pcb_server_state = 1; if (!p || err!=ERR_OK) { if(p){ pbuf_free(p); } tcp_pcb_server_state = 0; tcp_close(tcp_pcb_server);//關閉連接 return ERR_CLSD; } //接收TCP數據(固定) for(q=p;q!=NULL;q=q->next){ if(q->len > (TcpServerBuffLen-length))//接收的數據個數大於了數組可以接收的數據個數 memcpy(TcpServerBuff+length,q->payload,(TcpServerBuffLen-length));//只接收數組可以接收的數據個數 else memcpy(TcpServerBuff+length,q->payload,q->len);//接收TCP所有數據 length += q->len; if(length > TcpServerBuffLen) break; } if(TcpServerBuff[0] == 0xaa && TcpServerBuff[1] == 0x55){ if(TcpServerBuff[2] == 0x01){ if(TcpServerBuff[3] == 0x01){ GPIO_OUTPUT_SET(5, 1);//設置GPIO5輸出高電平 tcp_write(tcp_pcb_server, RelayOn, 4, TCP_WRITE_FLAG_COPY);//TCP_WRITE_FLAG_COPY:拷貝到發送緩存 tcp_output(tcp_pcb_server);//立即發送 } else if(TcpServerBuff[3] == 0x00){ GPIO_OUTPUT_SET(5, 0);//設置GPIO5輸出低電平 tcp_write(tcp_pcb_server, RelayOff, 4, TCP_WRITE_FLAG_COPY);//TCP_WRITE_FLAG_COPY:拷貝到發送緩存 tcp_output(tcp_pcb_server);//立即發送 } } } //固定處理 tcp_recved(tcp_pcb_server, p->tot_len);/*更新接收,告訴底層可以接着緩存數據了*/ pbuf_free(p);//釋放鏈表 return ERR_OK; }
5.先用TCP調試助手測試

5.1 電腦連接 8266 的無線

5.2 打開TCP客戶端,連接8266

5.3 發送16進制指令測試
控制繼電器吸合
aa 55 01 01


控制繼電器斷開
aa 55 01 00


C#上位機程序編寫
1.處理程序在這節的基礎上修改添加
https://www.cnblogs.com/yangfengwu/p/12397146.html
2.頁面修改如下

3.點擊控制繼電器按鈕

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 { MySocket.BeginSend(SendData, 0, SendData.Length, 0, null, null); //發送數據 } catch (Exception) { }
4.處理8266返回的數據

if (TCPBuffer[0] == 0x55 && TCPBuffer[1] == 0xaa) { if (TCPBuffer[2] == 0x01) { if (TCPBuffer[3] == 0x01)//繼電器吸合 { Invoke((new Action(() => {//C# 3.0以后代替委托的新方法 label3.Text = "吸合"; button2.Text = "斷開"; }))); } else if (TCPBuffer[3] == 0x00)//繼電器斷開 { Invoke((new Action(() => {//C# 3.0以后代替委托的新方法 label3.Text = "斷開"; button2.Text = "吸合"; }))); } } }
啟動測試
電腦連接8266無線

客戶端連接TCP服務器

1.控制繼電器吸合



2.控制繼電器斷開



