论武天地论坛

 找回密码
 立即注册
搜索
查看: 7566|回复: 0

6.02-综合实战篇-8266TCP服务器(LWIP,RAW模式,PCB控制块实现)(RTOS...

[复制链接]

58

主题

58

帖子

244

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
244
发表于 2020-10-27 23:36:55 | 显示全部楼层 |阅读模式


实现的功能
C#TCP客户端连接8266的TCP服务器,网络控制开发板继电器

1.控制继电器吸合



819239-20200303012040588-1102872995.png


819239-20200303012055721-501298595.png

819239-20200303012135230-985001969.png








2.控制继电器断开
819239-20200303012157131-1682367945.png


819239-20200303012212119-1223722301.png

819239-20200303012226365-375744086.png

前言
1.用户在看这一节之前请先学习

2.控制继电器引脚
819239-20200229230229812-1392698145.png


协议规定
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.处理程序在这节的基础上修改添加

2.配置GPIO5为普通引脚
819239-20200302233441686-330531857.png



    /*设置GPIO5为普通引脚*/
    PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U , FUNC_GPIO5);



3.定义用于返回继电器状态的数组
819239-20200302233539422-478546060.png



/*用于返回继电器的状态*/
u8 RelayOn[4]={0x55,0xaa,0x01,0x01};//继电器吸合
u8 RelayOff[4]={0x55,0xaa,0x01,0x00};//继电器断开



4.编写TCP接收处理程序

819239-20200302233902464-1025676818.png




/**
* @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调试助手测试
819239-20200302234943332-435073489.png




5.1 电脑连接 8266 的无线
819239-20200302234419890-732172481.png



5.2 打开TCP客户端,连接8266
819239-20200302234534109-1401739151.png



5.3 发送16进制指令测试
控制继电器吸合
aa  55  01 01
819239-20200302234751553-1605093765.png






819239-20200302234641081-157118805.png



控制继电器断开
aa  55  01 00
819239-20200302234814125-1505320553.png



819239-20200302234827675-1078141213.png




C#上位机程序编写
1.处理程序在这节的基础上修改添加

2.页面修改如下
819239-20200303011258420-1879729296.png
3.点击控制继电器按钮
819239-20200303012425741-1330636296.png



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返回的数据
819239-20200303012512390-1412821626.png



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无线
819239-20200303011951671-743707690.png



客户端连接TCP服务器
819239-20200303012008180-1226108292.png




1.控制继电器吸合














2.控制继电器断开







copycode.gif
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|论武天地论坛

GMT+8, 2024-11-25 21:40 , Processed in 0.082490 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表