野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8209|回复: 1

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

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

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

       UDP例程可以让W7500EVB实现UDP协议,进行非连接,快速的数据传输。但UDP协议传输数据本身是不稳定的,不会建立连接也不会检查应答,所以可能会造成丢包,但同时由于数据传输过程不需要进行连接过程,也不需要判断响应等,所以其传输速度比TCP协议会快很多。

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

使用道具 举报

 楼主| 发表于 2018-3-21 18:52:52 | 显示全部楼层
第二十一章 UDP21.1 UDP例程概述
       UDP例程可以让W7500EVB实现UDP协议,进行非连接,快速的数据传输。但UDP协议传输数据本身是不稳定的,不会建立连接也不会检查应答,所以可能会造成丢包,但同时由于数据传输过程不需要进行连接过程,也不需要判断响应等,所以其传输速度比TCP协议会快很多。
21.2 UDP协议简介
UDP协议是英文UserDatagramProtocol的缩写,即用户数据报协议,主要用来支持那些需要在计算机之间传输数据的网络应用。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天,UDP仍然不失为一项非常实用和可行的网络传输层协议。在网络中它与TCP协议一样,处于TCP/IP协议体系中的传输层,处于IP协议的上一层,用于处理数据包。与TCP不同的是,UDP是一种无连接的协议。也就是说,UDP发送数据之前不需要先建立连接(当然发送数据结束时也没必要释放连接),因此减少了时间上的开销。同时,UDP不使用拥塞控制,也不保证可靠交付,因此主机不需要维持具有许多参数的、复杂的连接状态表。总体来说,UDP是一种不可靠的数据传输协议,能提供比较快速的数据传输速度,但是并不保证数据的正确性。这些特性与TCP刚好相反。
UDP协议支持单播、广播和多播(组播)的通信。
网络之间的节点就好像人们在通话一样,如果一个人跟另外一个人说话,那么就可以称作是“单播”,单播是“一对一”通信,一次只能将数据传输给一个目的地址。网络上绝大部分的数据是以单播形式传输的,比如收发电子邮件、浏览网页。
广播通信则可理解为,一个人通过广播喇叭对在场所有人讲话,是“一对多”,信息一下子就散播开来。广播通信使用广播地址(255.255.255.255),将数据发送给所有的可接收的目的地址。
多播,又叫组播。与广播不同,它是把信息同时传递给一组目的地址,即与多个、在多播组注册的目的地址进行通信。
但广播和多播仅应用于UDP,它们对需将报文同时传往多个接收者的应用来说十分重要。在某些情况下,UDP协议可能会变得非常有用。因为UDP具有TCP所望尘莫及的速度优势。虽然TCP协议中植入了各种安全保障功能,但是在实际执行的过程中会占用大量的系统开销,严重影响速度。反观UDP,由于排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使速度得到了保证;在给定的主机上能识别多个目的地址,同时允许多个应用程序在同一台主机上工作,并能独立地进行数据报的发送和接收,包括视频会议、网络电话在内的众多网络应用都需要使用UDP。基于UDP的应用层协议有:TFTP、SNMP、NFS、DNS、BOOTP。
21.3 UDP数据报格式
采用UDP的端口来标识,首先UDP端口号可以是固定的,发送方只需要发送数据到指定端口即可。对于不同功能可以分配不同的端口号,来区分不同功能的数据。对于标准功能,也可以预先分配端口号,实现该功能的程序可以申请该端口号,这样,就可以将数据包发往申请的端口来实现此功能。
1.JPG
图21.3.1UDP报文组成结构
UDP源端端口和目的地端口指定了2个16bit的端口号。源端端口号可选,如果指定了,则相应数据包发往该端口,如果没有指定,则设为0。
UDP用户包长度表示了整个UDP数据包的8bit字节数据的数量,包含头部和数据部分,最小为8(数据可以为0)。
UDP校验和用以保证UDP数据包的完整性。该字段可选,没有计算校验和的UDP数据包应该将该字段设为0。
20.4 UDP例程解析
       例程初始化部分就不再赘述,有需要的可以查看Network install例程中初始化部分的讲解。下面我们具体分析UDP应用函数。
  1. 1.     int32_t udps(uint8_t sn, uint8_t* buf, uint16_t port)
  2. 2.     {
  3. 3.       uint16_t size;
  4. 4.      
  5. 5.       switch(getSn_SR(sn))         /*获取socket的状态*/
  6. 6.       {
  7. 7.         case SOCK_UDP :          /*socket初始化完成*/
  8. 8.             if((size = getSn_RX_RSR(sn)) > 0)
  9. 9.             {
  10. 10.            if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE;
  11. 11.            ret = recvfrom(sn, buf, size, destip, (uint16_t*)&destport);/*W7500接收计算机发送来的数据*/
  12. 12.            printf("%s\r\n",buf);
  13. 13.            if(ret <= 0)
  14. 14.            {
  15. 15.              #ifdef _LOOPBACK_DEBUG_
  16. 16.              printf("%d: recvfrom error. %ld\r\n",sn,ret);
  17. 17.              #endif
  18. 18.              return ret;
  19. 19.            }
  20. 20.            size = (uint16_t) ret;
  21. 21.            sentsize = 0;
  22. 22.            while(sentsize != size)
  23. 23.            {
  24. 24.              ret = sendto(sn, buf+sentsize, size-sentsize, destip, destport);/*W7500把接收到的数据发送给Remote*/
  25. 25.              if(ret < 0)
  26. 26.              {
  27. 27.                #ifdef _LOOPBACK_DEBUG_
  28. 28.                printf("%d: sendto error. %ld\r\n",sn,ret);
  29. 29.                #endif
  30. 30.                return ret;
  31. 31.              }
  32. 32.              sentsize += ret;
  33. 33.            }
  34. 34.          }
  35. 35.      break;
  36. 36.      case SOCK_CLOSED:                    /*socket处于关闭状态*/
  37. 37.          if((ret = socket(sn, Sn_MR_UDP, port, 0x00)) != sn)  /*初始化socket*/
  38. 38.            return ret;
  39. 39.          #ifdef _LOOPBACK_DEBUG_
  40. 40.          printf("%d:Opened, UDP loopback, port [%d]\r\n", sn, port);
  41. 41.          #endif
  42. 42.      break;
  43. 43.      default :
  44. 44.      break;
  45. 45.    }
  46. 46.    return 1;
  47. 47.  }
复制代码

       SOCK_UDP 的状态,默认是关闭,37行初始化SOCK_UDP。之后8行则是判断是否有数据发送到数据缓冲区,11行判断如果有就将数据复制到buf数组内,然后打印串口信息,并且将数据回发到发送方。
       至此,UDP例程代码解析就结束了。将UDP例程编译烧录后打印串口信息结果如图20.4.1。
2.JPG
图20.4.1UDP例程打印结果
       使用网络调试助手,测试PC和W7500EVB,是否能收发数据。结果如图20.4.2,连接成功,收发数据正常。W7500EVB设置为UDP协议成功。
3.JPG
图20.4.2 UDP数据交互

回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 03:36 , Processed in 0.030029 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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