ESP8266 SDK開發: 網絡篇-綜合-8266TCP服務器與C#TCP客戶端實現無線網絡通信控制


 

 

 

實現的功能

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

 

 

 

 

 

 


免責聲明!

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



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