• W5500 学习开发: TCP客户端


    TCP客户端

     W5500的TCP客户端百度到处都有,而且都是一个模子

    简而言之:就是这么写,这么用

    上菜

    /**
    * @brief   TCP客户端
    * @param   None
    * @retval  None
    * @warning None
    * @example
    **/
    void do_tcpc(void)
    {
        switch(getSn_SR(SOCK_TCPC))                                                           /*获取socket的状态*/
        {
            case SOCK_CLOSED:                                                                     /*socket处于关闭状态*/
                socket(SOCK_TCPC,Sn_MR_TCP,local_port++,Sn_MR_ND);
              break;
            case SOCK_INIT:                                                                         /*socket处于初始化状态*/
                connect(SOCK_TCPC,IP,Port);                /*socket连接服务器*/ 
                
              break;
            case SOCK_ESTABLISHED:                                                              /*socket处于连接建立状态*/
                if(getSn_IR(SOCK_TCPC) & Sn_IR_CON){
                    setSn_IR(SOCK_TCPC, Sn_IR_CON);                                      /*清除接收中断标志位*/
                }
                
                MainLen=getSn_RX_RSR(SOCK_TCPC);                                                /*获取接收的数据长度*/
                if(MainLen>0){//接收到数据
                    recv(SOCK_TCPC,MainBuffer,MainLen);                                           /*接收来自Server的数据*/
                    MainBuffer[MainLen]=0x00;                                                         /*添加字符串结束符*/
                    printf("
    接收到消息:
    ");
                    UsartOutStrIT(USART1,MainBuffer,MainLen);
                    
                    BufferManageWrite(&send_manage_struct3,MainBuffer,MainLen,&MainLen);//把数据写入发送缓存
                }
                
              break;
            case SOCK_CLOSE_WAIT:                                                              /*socket处于等待关闭状态*/
                close(SOCK_TCPC); 
              break;
        }
    }

    采用的socket1作为了TCP客户端

    测试准备工作(需要连接路由器)

    保证电脑/手机和W5500在同一个局域网内

    1.查看自己电脑的IP地址

    2.开启TCP服务器:监听 8080

    3.修改程序中连接的IP地址:根据自己的TCP服务器IP地址修改

    4.下载测试

    单片机串口1 -- 连接CH340 作为日志输出口

    单片机串口3 -- 连接485

    485连接如下:

    测试

    1.单片机程序为自动连接TCP服务器,首先保证有客户端连接

    2.服务器发消息给客户端

    3.485发送消息给TCP服务器

    程序说明

    1.执行DHCP以后执行TCP客户端程序

    2.接收数据以后,使用串口1打印输出

    把数据存入缓存

    3.读取缓存里面的数据,并使用串口3输出(485)

    4.如果串口3(485),缓存里面有数据,则转发给TCP 服务器

    细节说明

    1.从网口接收的数据,为啥要存入缓存

    然后再从缓存里面取出来以后再使用串口3发送出去?

    答:你想想如何解决下面的问题

    1.1.如果服务器突然过来的几条数据间隔很短,你使用串口3发送的时候你还没发送完就接着来新的数据了!

    1.2.如果服务器过来的数据非常多,你处理数据的时候又可能有延时,你该怎么做?

    1.3.有些时候需要每条数据有时间间隔,然后发送给485

    1.4.如果你需要发送完一条以后,需要等待485回复呢?

    2.为啥所有的串口都使用了缓存接收数据?

    答:最简单的例子

    485接收的数据转发给TCP

    你想想如何解决下面的问题:

    2.1 假设数据需要处理一下再发送给TCP,如果处理的时候又来了新数据怎么办?

    2.2 如果TCP服务器故障,但是我还希望最近的一条数据在服务器恢复以后接着发出去?

  • 相关阅读:
    STM32F407Discovery开发板使用环境搭建
    NIO初识
    Mac下Boost环境搭建
    Android Studio增加NDK代码编译支持--Mac环境
    LNMP平台搭建---PHP安装篇
    LNMP平台搭建---MySQL安装篇
    支付系统流程
    从html字符串中获取div内容---jquery
    记一次进入新公司快速融入开发团队经历
    DataTable复制自身行
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/12991839.html
Copyright © 2020-2023  润新知