三、W5100S/W5500+RP2040树莓派Pico<TCP Client数据回环测试>

这篇具有很好参考价值的文章主要介绍了三、W5100S/W5500+RP2040树莓派Pico<TCP Client数据回环测试>。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 前言

  在当今的计算机网络环境中,TCP(传输控制协议)是一种非常重要的通信协议。TCP提供了一种可靠、有序和错误控制的数据传输方式,被广泛应用于各种网络应用中。在TCP通信中,TCP Client是客户端的角色,它负责建立连接、发送数据和接收数据。

  本文以TCP Client为核心,让设备在TCP Client模式下进行数据回环测试。

  W5100S/W5500是一款集成全硬件 TCP/IP 协议栈的嵌入式以太网控制器,同时也是一颗工业级以太网控制芯片。在以太网应用中使用 W5100S/W5500 让用户可以更加方便地在设备之间实现远程连接和通信。

2. 协议简介

2.1 简述

  TCP (Transmission Control Protocol) 是一种面向连接的、可靠的、基于字节流的传输协议,用于在计算机网络上传输数据。TCP Client是指TCP网络服务的客户端连接,主动向服务器发起连接请求并建立连接,用于实现串口数据和服务器数据的交互,保证数据的可靠交换。TCP Clent通常用于设备与服务器之间的数据交互,是最常用的联网通信方式。
  TCP Client的主要作用是建立和管理与TCP服务器之间的连接,实现数据的可靠传输。通过TCP Client,设备可以向服务器发送数据并从服务器接收数据,从而实现设备与服务器之间的数据交互。
  在TCP Client中,客户端程序需要指定服务器的IP地址和端口号,并使用TCP协议与服务器建立连接。一旦连接建立成功,客户端程序就可以通过数据流对象 (NetworkStream) 与服务器进行数据交互。
  因此,TCP Client可以帮助设备实现与服务器之间的可靠数据交换,是设备联网通信的重要方式之一。在工业自动化、物联网、智能家居等应用中,TCP Client被广泛使用。

2.2 优点

  • 可靠性:TCP Client在数据传输过程中,通过TCP协议的确认机制、重传机制、拥塞控制机制等来确保数据的准确性和完整性,避免数据丢失或乱序。
  • 稳定性:TCP Client在建立连接时,需要经过三次握手过程,确保连接的稳定性和可靠性。在数据传输完成后,还会断开连接,以节约系统资源。
  • 效率:TCP的全双工传输模式使得TCP Client具有很高的数据传输效率。
  • 有序:TCP的字节流传输方式可以保证数据的顺序性和完整性。
  • 应用友好性:TcpClient类为应用层协议如FTP、HTTP等提供了更简单、更友好的接口,降低了应用层协议开发维护的成本。

2.3 应用

  • 网络数据库连接:许多数据库系统,如MySQL和PostgreSQL等,都支持使用TCP连接来接收客户端的连接请求并处理数据请求。
  • 远程桌面连接:使用TCP连接来远程控制另一台计算机的桌面或通过另一台计算机的操作进行网络浏览等。例如,RDP、VNC和SSH等协议都是使用TCP连接进行远程控制和操作的例子。
  • 文件传输:许多FTP和TFTP等文件传输协议使用TCP连接来传输文件。
  • 邮件服务器:SMTP、POP和IMAP等电子邮件协议都使用TCP连接来发送和接收电子邮件。
  • 网络游戏:许多网络游戏使用TCP连接来传输游戏数据和控制指令,以实现实时交互和同步。
  • 即时通讯:许多即时通讯应用程序使用TCP连接来传输音频、视频和文本消息。
  • 电子商务:TCP也可以用于电子商务应用中,例如处理用户登录、支付和购物车等。

3. WIZnet以太网芯片

WIZnet 主流硬件协议栈以太网芯片参数对比

Model Embedded Core Host I/F TX/RX Buffer HW Socket Network Performance
W5100S TCP/IPv4, MAC & PHY 8bit BUS, SPI 16KB 4 Max.25Mbps
W6100 TCP/IPv4/IPv6, MAC & PHY 8bit BUS, Fast SPI 32KB 8 Max.25Mbps
W5500 TCP/IPv4, MAC & PHY Fast SPI 32KB 8 Max 15Mbps
  1. W5100S/W6100 支持 8bit数据总线接口,网络传输速度会优于W5500。
  2. W6100 支持IPV6,与W5100S 硬件兼容,若已使用W5100S的用户需要支持IPv6,可以Pin to Pin兼容。
  3. W5500 拥有比 W5100S更多的 Socket数量以及发送与接收缓存。

4. TCP Client数据回环测试

4.1 程序流程图

三、W5100S/W5500+RP2040树莓派Pico<TCP Client数据回环测试>,W5100S/W5500+树莓派RP2040之C SDK开发,W5100S/W5500,树莓派RP2040,WIZnet,嵌入式设备以太网接入方案,TCP Client

4.2 测试准备

软件:

  • Visual Studio Code
  • WIZnet UartTool
  • SocketTester

硬件:

  • W5100SIO模块 + RP2040 树莓派Pico开发板 或者 WIZnet W5100S-EVB-Pico开发板
  • Micro USB 接口的数据线
  • TTL 转 USB
  • 网线

4.3 连接方式

  • 通过数据线连接PC的USB口(主要用于烧录程序,也可以虚拟出串口使用)
  • 通过TTL串口转USB,连接UART0 的默认引脚:
    • RP2040 GPIO 0(UART0 TX) <----> USB_TTL_RX
    • RP2040 GPIO 1(UART0 RX) <----> USB_TTL_TX
  • 使用模块连接RP2040进行连线时
    • RP2040 GPIO 16 <----> W5100S MISO
    • RP2040 GPIO 17 <----> W5100S CS
    • RP2040 GPIO 18 <----> W5100S SCK
    • RP2040 GPIO 19 <----> W5100S MOSI
    • RP2040 GPIO 20 <----> W5100S RST
  • 通过网线直接连接PC网口(或:PC和设备都通过网线连接交换机或路由器LAN口)

4.4 相关代码

  我们直接打开tcp_client.c文件(路径:examples/tcp_client/tcp_client.c)看下具体实现:

  可以看到这里是以dhcp模式配置网络信息的,因此在主控和W5100S初始化完成后,会进行DHCP初始化,然后增加一个定时器初始化,用来做dhcp过程中的计时以进行超时处理;接着进入dhcp配置网络信息,成功则直接进入循环调用回环测试函数,失败则用我们初始化的静态网络信息进行配置,然后再进入循环调用回环测试函数,如下所示:

/* Network information to be configured. */
wiz_NetInfo net_info = {
    .mac = {0x00, 0x08, 0xdc, 0x1e, 0xed, 0x2e}, // Configured MAC address
    .ip = {192, 168, 1, 10},                     // Configured IP address
    .sn = {255, 255, 255, 0},                    // Configured subnet mask
    .gw = {192, 168, 1, 1},                      // Configured gateway
    .dns = {8, 8, 8, 8},                         // Configured domain address
    .dhcp = NETINFO_DHCP};                       // Configured dhcp model,NETINFO_DHCP:use dhcp; NETINFO_STATIC: use static ip.

wiz_NetInfo get_info;
static uint8_t ethernet_buf[ETHERNET_BUF_MAX_SIZE] = {
    0,
};                                           // Send and receive cache
static uint8_t des_ip[4] = {192, 168, 1, 2}; // Server IP address
static uint16_t des_port = 8080;             // Server port
static uint16_t local_port = 8000;           // Local port
static uint8_t dhcp_get_ip_flag = 0;         // Define the DHCP acquisition flag

int main()
{
    struct repeating_timer timer; // Define the timer structure

    /* MCU init */
    stdio_init_all();     // Initialize the main control peripheral
    wizchip_initialize(); // Initialize the chip interface

    /*dhcp init*/
    DHCP_init(SOCKET_ID, ethernet_buf);                                   // DHCP initialization
    add_repeating_timer_ms(1000, repeating_timer_callback, NULL, &timer); // Add DHCP 1s Tick Timer handler

    printf("wiznet chip tcp client example.\r\n");
    network_init(&net_info); // Configuring Network Information
    print_network_information(&get_info);   // Read back the configuration information and print it
    
    while (true)
    {
        loopback_tcpc(SOCKET_ID, ethernet_buf, des_ip, des_port, local_port); // tcp client data loop test
    }
}

  跳进回环测试里面看下其具体实现: 该函数有这几个参数,socket端口号、数据收发缓存、目标IP地址、目标端口;可根据需要自行填入参数。其整体通过一个Swatch状态机轮询socket状态,根据不同进行相应的处理,依次完成了初始化、打开端口、连接服务器、收到数据后回传的操作 ;其中本地端口直接在函数内初始化了。如下所示:

/**
 * @brief   tcp client loopback test
 * @param   sn:         socket number
 * @param   buf:        Data sending and receiving cache
 * @param   destip:     Destination IP address
 * @param   destport:   Destination port
 * @return  value for SOCK_ERRORs,return 1:no error 
*/
int32_t loopback_tcpc(uint8_t sn, uint8_t* buf, uint8_t* destip, uint16_t destport)
{
   int32_t ret; // return value for SOCK_ERRORs
   uint16_t size = 0, sentsize=0;

   // Destination (TCP Server) IP info (will be connected)
   // >> loopback_tcpc() function parameter
   // >> Ex)
   //	uint8_t destip[4] = 	{192, 168, 0, 214};
   //	uint16_t destport = 	5000;

   // Port number for TCP client (will be increased)
   uint16_t any_port = 	50000;

   // Socket Status Transitions
   // Check the W5500 Socket n status register (Sn_SR, The 'Sn_SR' controlled by Sn_CR command or Packet send/recv status)
   switch(getSn_SR(sn))
   {
      case SOCK_ESTABLISHED :
         if(getSn_IR(sn) & Sn_IR_CON)	// Socket n interrupt register mask; TCP CON interrupt = connection with peer is successful
         {
#ifdef _LOOPBACK_DEBUG_
			printf("%d:Connected to - %d.%d.%d.%d : %d\r\n",sn, destip[0], destip[1], destip[2], destip[3], destport);
#endif
			setSn_IR(sn, Sn_IR_CON);  // this interrupt should be write the bit cleared to '1'
         }

         //
         // Data Transaction Parts; Handle the [data receive and send] process
         //
		 if((size = getSn_RX_RSR(sn)) > 0) // Sn_RX_RSR: Socket n Received Size Register, Receiving data length
         {
			if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE; // DATA_BUF_SIZE means user defined buffer size (array)
			ret = recv(sn, buf, size); // Data Receive process (H/W Rx socket buffer -> User's buffer)
         buf[ret]=0x00;            // Add a string terminator
         printf("recv: %s\n",buf); // print the receive data
			if(ret <= 0) return ret; // If the received data length <= 0, receive failed and process end
			size = (uint16_t) ret;
			sentsize = 0;

			// Data sentsize control
			while(size != sentsize)
			{
				ret = send(sn, buf+sentsize, size-sentsize); // Data send process (User's buffer -> Destination through H/W Tx socket buffer)
				if(ret < 0) // Send Error occurred (sent data length < 0)
				{
					close(sn); // socket close
					return ret;
				}
				sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.
			}
         }
		 //
         break;

      case SOCK_CLOSE_WAIT :
#ifdef _LOOPBACK_DEBUG_
         //printf("%d:CloseWait\r\n",sn);
#endif
         if((ret=disconnect(sn)) != SOCK_OK) return ret;
#ifdef _LOOPBACK_DEBUG_
         printf("%d:Socket Closed\r\n", sn);
#endif
         break;

      case SOCK_INIT :
#ifdef _LOOPBACK_DEBUG_
    	 printf("%d:Try to connect to the %d.%d.%d.%d : %d\r\n", sn, destip[0], destip[1], destip[2], destip[3], destport);
#endif
    	 if( (ret = connect(sn, destip, destport)) != SOCK_OK) return ret;	//	Try to TCP connect to the TCP server (destination)
         break;

      case SOCK_CLOSED:
    	  close(sn);
    	  if((ret=socket(sn, Sn_MR_TCP, any_port++, 0x00)) != sn){
         if(any_port == 0xffff) any_port = 50000;
         return ret; // TCP socket open with 'any_port' port number
        } 
#ifdef _LOOPBACK_DEBUG_
    	 //printf("%d:TCP client loopback start\r\n",sn);
         //printf("%d:Socket opened\r\n",sn);
#endif
         break;
      default:
         break;
   }
   return 1;
}

4.5 测试现象

  硬件连接无误后,编译烧录程序(具体可参考第一章节),打开WIZ UartTool,选择对应的COM口,填入参数:波特率115200,8位数据位,1位停止位,无校验位,无流控,填完参数后点击open打开,观察串口打印的信息以获取设备运行状态;打开SocketTester,在左列填入相对应的参数,选择TCP server模式,本地IP和监听端口根据串口打印的信息填入,完成后点击Listen监听,连接成功后发送数据观察现象;可以看到数据成功发送并成功回传,如下图所示:

三、W5100S/W5500+RP2040树莓派Pico<TCP Client数据回环测试>,W5100S/W5500+树莓派RP2040之C SDK开发,W5100S/W5500,树莓派RP2040,WIZnet,嵌入式设备以太网接入方案,TCP Client

5. 注意事项

  • 不要混淆服务器IP和客户端IP。
  • 连接后交互过程不要突然断开网线,造成假链接。
  • 如果想用WIZnet的W5500来实现本章的示例,我们只需修改两个地方即可:
  1. 在library/ioLibrary_Driver/Ethernet/下找到wizchip_conf.h这个头文件,将_WIZCHIP_ 宏定义修改为W5500。
  2. 在library下找到CMakeLists.txt文件,将COMPILE_SEL设置为ON即可,OFF为W5100S,ON为W5500。

6. 相关链接

WIZnet官网

WIZnet官方库链接

本章例程链接

想了解更多,评论留言哦!文章来源地址https://www.toymoban.com/news/detail-716833.html

到了这里,关于三、W5100S/W5500+RP2040树莓派Pico<TCP Client数据回环测试>的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • W5100S-EVB-PICO作为TCP Client 进行数据回环测试(五)

            上一章我们用W5100S-EVB-PICO开发板通过DNS解析www.baidu.com(百度域名)成功得到其IP地址,那么本章我们将用我们的开发板作为客户端去连接服务器,并做数据回环测试:收到服务器发送的数据,并回传给服务器。         TCP (Transmission Control Protocol) 是一种面向连

    2024年02月13日
    浏览(40)
  • W5500-EVB-PICO作为TCP Client 进行数据回环测试(五)

            上一章我们用W5500-EVB-PICO开发板通过DNS解析www.baidu.com(百度域名)成功得到其IP地址,那么本章我们将用我们的开发板作为客户端去连接服务器,并做数据回环测试:收到服务器发送的数据,并回传给服务器。         TCP (Transmission Control Protocol) 是一种面向连

    2024年02月13日
    浏览(42)
  • 六、W5100S/W5500+RP2040之MicroPython开发<UDP示例>

      在这个智能硬件和物联网时代,MicroPython和树莓派PICO正以其独特的优势引领着嵌入式开发的新潮流。MicroPython作为一种精简优化的Python 3语言,为微控制器和嵌入式设备提供了高效开发和简易调试的   当我们结合WIZnet W5100S/W5500网络模块,MicroPython和树莓派PICO的开发潜力

    2024年01月22日
    浏览(39)
  • 八、W5100S/W5500+RP2040之MicroPython开发<HTTP Server示例>

      随着云计算的推广和普及,越来越多的网络设备和服务需要连接到网络,这意味着需要更多的IP地址和其他网络配置信息。DHCP服务器可以动态地分配IP地址和其他配置信息,简化了网络配置管理,提高了网络设备的可用性和效率。   W5100S/W5500是一款集成全硬件 TCP/IP 协

    2024年02月20日
    浏览(36)
  • 九、W5100S/W5500+RP2040之MicroPython开发<HTTP&OneNET示例>

      在这个智能硬件和物联网时代,MicroPython和树莓派PICO正以其独特的优势引领着嵌入式开发的新潮流。MicroPython作为一种精简优化的Python 3语言,为微控制器和嵌入式设备提供了高效开发和简易调试的   当我们结合WIZnet W5100S/W5500网络模块,MicroPython和树莓派PICO的开发潜力

    2024年02月03日
    浏览(48)
  • W5500-EVB-PICO做UDP Client进行数据回环测试(八)

            上一章我们用开发板作为UDP Server进行数据回环测试,本章我们让我们的开发板作为UDP Client进行数据回环测试。 使开发板和我们的电脑处于同一网段: 开发板通过交叉线直连主机 开发板和主机都接在路由器LAN口 网路调试工具(任意) wireshark抓包工具 我们打开例程

    2024年02月12日
    浏览(37)
  • RPI pico(树莓派 pico RP2040微控制器) 教程1:刷固件

       树莓派pico搭载了两个ARM Cortex-M0+内核最高频率133MHz、 264KB的内部RAM、DMA控制器,支持挂最高达16MB的片外Flash。它有30个GPIO,4个可以作为模拟输入。外设包含2个UART、2个SPI、2个I2C、16个PWM通道以及一个USB1.1控制器。树莓派pico支持c/c++和 python两种编程方式, 我们这里使用p

    2024年02月13日
    浏览(83)
  • 树莓派Raspberry Pico RP2040 开发环境配置完全缝合终极版C-SDK

    更新:这篇文章写的有点乱,后续整理见我的个人博客:rp2040开发环境配置集合版 如果你只想要使用VScode作为你的开发环境,那么这篇会是更好的参考: RP2040配置VSCODE开发环境——一劳永逸版 RP2040作为一款树莓派的单片机,一开始我以为会有很成熟的开发方案,结果发现网

    2024年02月01日
    浏览(43)
  • W5100S-EVB-PICO 做TCP Server进行回环测试(六)

            上一章我们用W5100S-EVB-PICO开发板做TCP 客户端连接服务器进行数据回环测试,那么本章将用开发板做TCP服务器来进行数据回环测试。         TCP (Transmission Control Protocol) 是一种面向连接的、可靠的、基于字节流的传输协议,用于在计算机网络上传输数据。TCP S

    2024年02月13日
    浏览(41)
  • W5500-EVB-PICO 做TCP Server进行回环测试(六)

            上一章我们用W5500-EVB-PICO开发板做 TCP 客户端连 接服务器进行数据回环测试,那么本章将用开发板做 TCP服务器 来进行数据回环测试。         TCP (Transmission Control Protocol) 是一种面向连接的、可靠的、基于字节流的传输协议,用于在计算机网络上传输数据。TC

    2024年02月13日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包