野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 7461|回复: 1

W7500 M0+MAC+TCP/IP 以太网单芯片方案 W7500 W7500EVB用户手册连载(19)--网络篇

[复制链接]
发表于 2018-3-20 16:32:20 | 显示全部楼层 |阅读模式
W7500(W7500P)芯片简介:
W7500 芯片为工业级以太网单芯片解决方案, 集成 ARM Cortex-M0,128KB Flash 及全硬件TCP/IP 核(和W5500、W5100内核一致),特别适用于物联网领域。 使用 W7500EVB, 让您轻松完成原型开发。

全硬件TCP/IP核的最大优点是他在执行联网操作时不需要占用MCU的运行资源,大大增加了MCU的工作效率。

TCP Client例程与TCP Server例程类似,本章节就主要应用函数进行讲解。TCP Client例程是将W7500EVB配置成TCP客户端模式, 向指定的TCP服务器IP、端口发起连接。实现数据的接收与发送。

想了解更多关于WIZnet W7500更多信息,或者有技术问题请联系我们:gustin@wisioe.com
深圳炜世科技—WIZnet官方代理商,全程技术支持,价格绝对优势!
电话:0755-86568556
邮箱:support@wisioe.com
回复

使用道具 举报

 楼主| 发表于 2018-3-20 16:33:02 | 显示全部楼层
第二十章 TCP Client20.1 TCP Client例程概述
       TCP Client例程与TCP Server例程类似,本章节就主要应用函数进行讲解。
       TCP Client例程是将W7500EVB配置成TCP客户端模式, 向指定的TCP服务器IP、端口发起连接。实现数据的接收与发送。
20.2 TCP客户端流程
1.JPG

图20.2.1 TCP Client流程图
20.3 TCP Client例程解析
       例程的初始化部分和Network install例程相同,在此就不在赘述了。具体分析TCP Client的应用函数do_tcp_client()。
  1. 1.     int32_t tcpc(uint8_t sn, uint8_t* buf, uint8_t* destip, uint16_t destport,uint16_t local_port)
  2. 2.     {
  3. 3.       int32_t ret; // return value for SOCK_ERRORs
  4. 4.       uint16_t size = 0, sentsize=0;
  5. 5.       switch(getSn_SR(sn))                             /*获取socket的状态*/
  6. 6.       {
  7. 7.           case SOCK_ESTABLISHED :            /*socket处于连接建立状态*/
  8. 8.             if(getSn_IR(sn) & Sn_IR_CON)
  9. 9.             {
  10. 10.            setSn_IR(sn, Sn_IR_CON);             /*清除接收中断标志位*/
  11. 11.          }
  12. 12.          if((size = getSn_RX_RSR(sn)) > 0)
  13. 13.          {
  14. 14.            if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE;
  15. 15.            ret = recv(sn, buf, size);                  /*接收来自Server的数据*/
  16. 16.            if(ret <= 0) return ret;
  17. 17.            sentsize = 0;
  18. 18.            while(size != sentsize)
  19. 19.            {
  20. 20.              ret = send(sn, buf+sentsize, size-sentsize);/*向Server发送数据*/
  21. 21.              printf("%s\r\n",buf);
  22. 22.              if(ret < 0)
  23. 23.              {
  24. 24.                close(sn);
  25. 25.                return ret;
  26. 26.              }
  27. 27.              sentsize += ret;
  28. 28.            }
  29. 29.          }
  30. 30.          break;
  31. 31.        case SOCK_CLOSE_WAIT :                    /*socket处于等待关闭状态*/
  32. 32.          if((ret=disconnect(sn)) != SOCK_OK) return ret;
  33. 33.          #ifdef _LOOPBACK_DEBUG_
  34. 34.          printf("%d:Socket Closed\r\n", sn);
  35. 35.          #endif
  36. 36.          break;
  37. 37.        case SOCK_INIT :                           /*socket处于初始化状态*/
  38. 38.          #ifdef _LOOPBACK_DEBUG_
  39. 39.          printf("%d:Try to connect to the %d.%d.%d.%d : %d\r\n", sn, destip[0], destip[1], destip[2], destip[3], destport);
  40. 40.          #endif
  41. 41.          if( (ret = connect(sn, destip, destport)) != SOCK_OK) return ret; /*socket连接服务器*/
  42. 42.          break;
  43. 43.        case SOCK_CLOSED:               /*socket处于关闭状态*/
  44. 44.          close(sn);
  45. 45.          if((ret=socket(sn, Sn_MR_TCP, local_port, 0x00)) != sn) return ret; // TCP socket open with 'any_port' port number
  46. 46.          break;
  47. 47.        default:
  48. 48.          break;
  49. 49.    }
  50. 50.    return 1;
  51. 51.  }
复制代码

       5~49行跟TCP Server例程一样,也是switch判断套接字状态,45初始化socket为TCP Client模式后,41行向指定端口IP的TCP Server发起连接,12行成功建立连接后判断空闲接收缓存寄存器接收数据的长度,如果读取的数据长度大于0则表示接收到数据,程序会将接收的数据回发给数据发送方。
       至此,TCP Server例程代码解析就结束了。将TCP Server例程编译烧录后打印串口信息结果如图20.3.1。
2.JPG
图20.3.1 TCP Client例程打印结果
       使用网络调试助手,PC机以TCP服务器身份等待W7500EVB连接,测试是否能收发数据。结果如图20.3.2,连接成功,收发数据正常。W7500EVB设置为TCP客户端模式成功。
3.JPG
图20.3.2TCP Client例程数据交互

回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-1 10:58 , Processed in 0.040677 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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