0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

第二十四章 W55MH32TCP_Client_Multi_Socket示例

W55MH32 来源:W55MH32 作者:W55MH32 2025-07-24 16:08 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

单芯片解决方案,开启全新体验——W55MH32 高性能以太网单片机

W55MH32是WIZnet重磅推出的高性能以太网单片机,它为用户带来前所未有的集成化体验。这颗芯片将强大的组件集于一身,具体来说,一颗W55MH32内置高性能Arm® Cortex-M3核心,其主频最高可达216MHz;配备1024KB FLASH与96KB SRAM,满足存储与数据处理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP协议栈、内置MAC以及PHY,拥有独立的32KB以太网收发缓存,可供8个独立硬件socket使用。如此配置,真正实现了All-in-One解决方案,为开发者提供极大便利。

在封装规格上,W55MH32提供了两种选择:QFN100和QFN68。

W55MH32L采用QFN100封装版本,尺寸为12x12mm,其资源丰富,专为各种复杂工控场景设计。它拥有66个GPIO、3个ADC、12通道DMA、17个定时器、2个I2C、5个串口、2个SPI接口(其中1个带I2S接口复用)、1个CAN、1个USB2.0以及1个SDIO接口。如此丰富的外设资源,能够轻松应对工业控制中多样化的连接需求,无论是与各类传感器、执行器的通信,还是对复杂工业协议的支持,都能游刃有余,成为复杂工控领域的理想选择。同系列还有QFN68封装的W55MH32Q版本,该版本体积更小,仅为8x8mm,成本低,适合集成度高的网关模组等场景,软件使用方法一致。更多信息和资料请进入http://www.w5500.com/网站或者私信获取。

此外,本W55MH32支持硬件加密算法单元,WIZnet还推出TOE+SSL应用,涵盖TCP SSL、HTTP SSL以及 MQTT SSL等,为网络通信安全再添保障。

为助力开发者快速上手与深入开发,基于W55MH32L这颗芯片,WIZnet精心打造了配套开发板。开发板集成WIZ-Link芯片,借助一根USB C口数据线,就能轻松实现调试、下载以及串口打印日志等功能。开发板将所有外设全部引出,拓展功能也大幅提升,便于开发者全面评估芯片性能。

若您想获取芯片和开发板的更多详细信息,包括产品特性、技术参数以及价格等,欢迎访问官方网页:http://www.w5500.com/,我们期待与您共同探索W55MH32的无限可能。

wKgZO2iBiBmAe3DyAACpGc5mWX8613.png

第二十四章 W55MH32TCP_Client_Multi_Socket示例

本篇文章,我们将详细介绍如何在W55MH32芯片上面实现TCP通信。使用W55MH32的TOE引擎,我们只需进行简单的socket编程寄存器读写,便可轻松实现TCP协议应用。接下来我们通过实战例程,为大家讲解如何使用TOE引擎上的8个socket,设置为TCP Client模式,同时连接1个服务器进行数据回环测试。

该例程用到的其他网络协议,例如DHCP,请参考相关章节。有关W55MH32的初始化过程,请参考Network Install章节,这里将不再赘述。

1 TCP协议简介

TCP (Transmission Control Protocol)是一种面向连接的、可靠的传输层协议,它用于在网络中可靠地传输数据。TCP是互联网协议族中的核心协议之一,通常与 IP协议(Internet Protocol)一起使用,形成套接字通信。

2 TCP协议特点

面向连接:在传输数据之前,TCP需要建立一个连接,保证发送方与接收方能够彼此通信。通过三次握手(Three-Way Handshake)过程来建立连接,确保双方的通信是可靠的。

可靠性:TCP提供可靠的数据传输,确保数据完整并且按顺序到达接收端。如果数据丢失或出错,TCP会自动重传丢失的数据包。

流量控制:TCP使用流量控制机制来调节数据的发送速度,防止接收方处理不过来导致数据丢失。常用的流量控制方法是滑动窗口(Sliding Window)。

拥塞控制:TCP可以动态调整传输速率,以避免网络拥塞。采用算法如慢启动、拥塞避免、快速重传等。

全双工通信:在 TCP连接建立后,数据可以在两个方向同时进行传输,支持双向通信。

有序数据传输:TCP会对数据包进行编号,确保数据按顺序传输,即使网络发生延迟,接收端也能按顺序接收到数据。

字节流服务:TCP传输的数据是字节流,不关心应用层数据的边界,应用层需要自己解析数据边界。

3 TCP与 UDP的区别

TCP是可靠的、面向连接的协议,适合需要数据完整性和顺序保证的应用,如网页浏览、文件传输等。

UDP(User Datagram Protocol)是无连接、不可靠的协议,适合对时效性要求较高且可以容忍丢包的应用,如视频流、在线游戏等。

4 TCP应用场景

接下来,我们了解下在W55MH32上,可以使用TCP协议完成哪些操作及应用呢?

远程监控和数据采集嵌入式设备通常用于采集传感器数据,并通过以太网连接上传到远程服务器,TCP协议确保数据传输的可靠性和完整性。

设备远程控制:许多嵌入式系统需要通过网络接收控制指令(例如工业自动化中的PLC控制),TCP协议提供了可靠的通信通道。

物联网IoT:许多物联网设备使用TCP协议与云服务器或其他设备进行通信,传输数据、执行命令等。

嵌入式Web服务器:一些嵌入式设备内置Web服务器(例如路由器、网关、传感器设备等),通过TCP协议提供网页接口给用户进行配置和监控。

5使用TCP进行数据交互的流程

TCP 连接建立(三次握手)

在开始传输数据之前,TCP会通过三次握手建立连接:

第一次握手:客户端向服务器发送一个带有 SYN标志的数据包,表示请求建立连接。

第二次握手:服务器收到 SYN数据包后,回复一个带有 SYN和 ACK标志的数据包,表示同意建立连接。

第三次握手:客户端收到服务器的 SYN+ACK后,发送一个带有 ACK标志的数据包,连接建立完成。

数据交互

TCP 连接断开(四次挥手)

当通信结束时,TCP需要通过四次挥手来断开连接:

第一次挥手:客户端发送一个 FIN 数据包,表示数据发送完毕,准备关闭连接。

第二次挥手:服务器收到 FIN数据包后,回复一个 ACK数据包,表示同意关闭连接。

第三次挥手:服务器发送一个 FIN 数据包,表示数据发送完毕,准备关闭连接。

第四次挥手:客户端收到服务器的 FIN数据包后,发送一个 ACK数据包,连接正式关闭。

ACK字段:ACK包含在 TCP报文头中,表示接收方期望接收的下一个字节的序列号。

wKgZPGiB2d6AaBqcAABA4kCDWJo716.png

TCP 3次握手示意图

wKgZPGiB2d6AXeDvAAAw-KtnzI4612.png

TCP 4次挥手示意图

6 TCP的ACK机制、重传机制和Keepalive机制

TCP的ACK机制

ACK是 TCP用于确认已成功接收到数据包的机制。在 TCP通信中,每个数据包都包含一个序列号,接收方用 ACK来告诉发送方已经成功收到的字节序列。

累积确认:TCP使用累积确认方式,表示接收方已经连续收到所有数据,直到某个序列号为止。

超时重传:如果发送方在超时时间内未收到 ACK,就会重传该数据包。

TCP 的重传机制

TCP的重传机制保证了数据的可靠传输。以下是常见的重传机制:

超时重传

发送方设置一个定时器,当发送的数据包在规定时间内未收到 ACK,则触发重传。

超时时间是动态调整的,由 TCP的往返时间(RTT, Round Trip Time)估算得出。

快速重传

当接收方发现数据包丢失时,发送重复的 ACK(称为冗余 ACK),提醒发送方某个数据包未到达。

如果发送方连续收到 3个重复的 ACK,就会立即重传对应的数据包,而不必等待超时。

选择性重传(Selective Repeat, SACK)

在累积确认的基础上,TCP还可以通过 SACK选项告诉发送方哪些特定的块已收到,哪些未收到。

这可以减少不必要的重传,提高效率。

TCP Keepalive机制

TCP Keepalive是 TCP协议的一种可选机制,用于检测长时间空闲的连接是否仍然有效。它的主要作用是:

维护连接状态:检测对方主机是否仍在线,避免资源被长期占用。

释放死连接:如果连接已经失效(如网络中断或对方主机崩溃),Keepalive可以及时释放资源。

防止中间设备超时关闭连接:一些 NAT、路由器或防火墙可能会在连接长时间不活动时自动关闭,Keepalive可防止这种情况。

用法:在W55MH32的TOE引擎中,需要在Sn_KPALVTR寄存器中设置Keepalive时间,然后在成功连接服务器后发送一条数据来激活Keepalive。

7实现过程

接下来,我们看看如何在代码中实现同时开启8个socket进行回环测试。

注意:测试实例需要PC端和W55MH32处于同一网段。

首先需要在主函数中调用multi_tcpc_socket()函数。

 while(1)
     {
         multi_tcpc_socket(ethernet_buf, dest_ip, dest_port);
    }

multi_tcpc_socket()函数有三个参数:ethernet_buf作为数据缓冲区,用于在客户端和服务器之间的数据传输。

dest_ip代表目标服务器的 IP地址。dest_port是目标服务器的端口号。

multi_tcpc_socket()函数内容如下:

 1. int32_t multi_tcpc_socket(uint8_t*buf,uint8_t*destip,uint16_t destport)
 2. {
 3.     int32_t ret;// return value for SOCK_ERRORs
 4.     uint16_t size=0, sentsize=0;
 5.     // Socket Status Transitions
 6.     // Check the W5500 Socket n status register (Sn_SR, The 'Sn_SR' controlled by Sn_CR command or Packet send/recv status)
 7.     switch(getSn_SR(socket_sn))
 8.     {
 9.     case SOCK_ESTABLISHED:
10.         if(getSn_IR(socket_sn)&Sn_IR_CON)// Socket n interrupt register mask; TCP CON interrupt = connection with peer is successful
11.         {
12. #ifdef _LOOPBACK_DEBUG_
13.             printf("%d:Connected to - %d.%d.%d.%d : %drn", socket_sn, destip[0], destip[1], destip[2], destip[3], destport);
14. #endif
15.             setSn_IR(socket_sn,Sn_IR_CON);// this interrupt should be write the bit cleared to '1'
16.         }
17.         //////////////////////////////////////////////////////////////////////////////////////////////
18.         // Data Transaction Parts; Handle the [data receive and send] process
19.         //////////////////////////////////////////////////////////////////////////////////////////////
20.         if((size= getSn_RX_RSR(socket_sn))>0)// Sn_RX_RSR: Socket n Received Size Register, Receiving data length
21.         {
22.             if(size> DATA_BUF_SIZE)
23.                 size= DATA_BUF_SIZE;              // DATA_BUF_SIZE means user defined buffer size (array)
24.             ret      = recv(socket_sn, buf, size);// Data Receive process (H/W Rx socket buffer -> User's buffer)
25.             buf[size]=0x00;
26.             printf("%d:rece from %d.%d.%d.%d:%d data:%srn", socket_sn, destip[0], destip[1], destip[2], destip[3], destport, buf);
27.             if(ret<= 0)
28.                 return ret; // If the received data length <= 0, receive failed and process end
29.             size     = (uint16_t)ret;
30.             sentsize = 0;
31. 
32.             // Data sentsize control
33.             while (size != sentsize)
34.             {
35.                 ret = send(socket_sn, buf + sentsize, size - sentsize); // Data send process (User's buffer - > Destination through H/W Tx socket buffer)
36.                 if(ret<  0)                                            // Send Error occurred (sent data length < 0)
37.                 {
38.                     close(socket_sn);                                   // socket close
39.                     return ret;
40.                 }
41.                 sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.
42.             }
43.         }
44.         //////////////////////////////////////////////////////////////////////////////////////////////
45.         break;
46.     case SOCK_CLOSE_WAIT:
47. #ifdef _LOOPBACK_DEBUG_
48.         printf("%d:CloseWaitrn", socket_sn);
49. #endif
50.         if ((ret = disconnect(socket_sn)) != SOCK_OK)
51.             return ret;
52. #ifdef _LOOPBACK_DEBUG_
53.         printf("%d:Socket Closedrn", socket_sn);
54. #endif
55.         break;
56.     case SOCK_INIT:
57. #ifdef _LOOPBACK_DEBUG_
58.         printf("%d:Try to connect to the %d.%d.%d.%d : %drn", socket_sn, destip[0], destip[1], destip[2], destip[3], destport);
59. #endif
60.         if ((ret = connect(socket_sn, destip, destport)) != SOCK_OK)
61.             return ret; // Try to TCP connect to the TCP server (destination)
62.         break;
63.     case SOCK_CLOSED:
64.         close(socket_sn);
65.         if ((ret = socket(socket_sn, Sn_MR_TCP, any_port++, 0x00)) != socket_sn)
66.         {
67.             if (any_port == 0xffff)
68.                 any_port = 50000;
69.             return ret; // TCP socket open with 'any_port' port number
70.         }
71. #ifdef _LOOPBACK_DEBUG_
72.         printf("%d:TCP client loopback startrn", socket_sn);
73.         printf("%d:Socket openedrn", socket_sn);
74. 
75. #endif
76.         break;
77.     default:
78.         break;
79.     }
80. 
81.     if (socket_sn < _WIZCHIP_SOCK_NUM_)
82.     {
83.         socket_sn++;
84.     }
85.     else
86.     {
87.         socket_sn = 0;
88.     }
89.     return 1;
90. }
91. 

在这个函数中,会运行一个TCP Client状态机,基于不同的的SOCKET的状态执行对应的操作,SOCKET的状态变化如下图所示:

wKgZPGiB2d6AXeDvAAAw-KtnzI4612.png

SOCK_CLOSED:当前SOCKET未打开,配置连接服务器及连接端口号后打开SOCKET,打开成功后SOCKET会进入SOCK_INIT状态。

注意:因为在W55MH32异常断开服务器时,服务器并不知道我们已经掉线了,所以继续使用上一次连接的端口进行连接时会被服务器拒绝连接,因此我们这里在连接失败后会将连接端口自动加1,解决重连失败的问题。如果是在一些特定的场景下,服务器只允许客户端使用固定端口连接,这里就不能使用连接端口自动加1的操作。

SOCK_INIT:SOCKET执行连接服务器操作,如果连接成功,SOCKET状态改为SOCK_ESTABLISHED;连接失败,SOCKET状态改为关闭状态。

SOCK_ESTABLISHED:首先清除连接成功中断,并发送1包数据激活KeepAlive,然后读取Sn_RX_RSR(空闲接收缓存寄存器)寄存器的值,当收到服务器数据时,Sn_RX_RSR寄存器的值会大于0,此时我们将接收到的数据打印并将数据回环发送。

SOCK_CLOSE_WAIT:当服务器主动断开连接时,SOCKET状态改为SOCK_CLOSE_WAIT状态,这是一个半关闭状态,可以进行关闭前最后的数据传输。使用disconnect()函数彻底断开连接时,SOCKET状态将改为SOCK_CLOSED状态。

执行完状态机后,会自动切换到下一个socket,这样就能实现同时开启8个socket进行TCP Client模式的数据回环测试了。

8运行结果

烧录例程运行后,首先进行了PHY链路检测,然后打印设置的网络地址信息,最后则是TCP_Client_Multi_Socket数据回环测试。当服务器未开启时,会一直打印打开socket和连接服务器提示消息。

wKgZO2iB2d6AHZT2AACBfS94W54094.pngwKgZPGiB2d6AUk_mAACfNSWAHbs678.png

9总结

本文讲解了如何在 W55MH32芯片上使用 8个 socket实现 TCP客户端模式,同时连接 1个服务器进行数据回环测试,通过实战例程展示了从初始化 socket到建立连接、数据交互及处理连接关闭的完整过程。文章详细介绍了 TCP协议的概念、特点、与 UDP的区别、应用场景、数据交互流程、ACK机制、重传机制和 Keepalive机制,帮助读者理解其在可靠数据传输中的实际应用价值。

下一篇文章将讲解如何在 W55MH32上实现多路 Socket设置为 TCP服务器模式,并监听同一个端口进行测试,解析该功能的核心原理及应用,同时讲解在 W55MH32上实现该功能的具体步骤与要点,敬请期待!

WIZnet是一家无晶圆厂半导体公司,成立于 1998年。产品包括互联网处理器 iMCU™,它采用 TOE(TCP/IP卸载引擎)技术,基于独特的专利全硬连线 TCP/IP。iMCU™面向各种应用中的嵌入式互联网设备。

WIZnet在全球拥有 70多家分销商,在香港、韩国、美国设有办事处,提供技术支持和产品营销。

香港办事处管理的区域包括:澳大利亚、印度、土耳其、亚洲(韩国和日本除外)。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5186

    文章

    20146

    浏览量

    328816
  • 以太网
    +关注

    关注

    41

    文章

    5923

    浏览量

    179532
  • Client
    +关注

    关注

    0

    文章

    13

    浏览量

    9244
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    第二十四章 WWDG——窗口看门狗

    W55MH32的窗口看门狗是7位递减计数器,有上下窗口值,时钟来自PCLK1用于监测软件故障,代码演示了其配置、中断测试与复位测试。
    的头像 发表于 06-20 14:00 1023次阅读
    <b class='flag-5'>第二十四章</b> WWDG——窗口看门狗

    第二十四章 通用同步异步收发器(USART)

    本文介绍了W55MH32的通用同步异步收发器(USART),其支持全双工异步通信、NRZ格式,具分数波特率发生器,可编程数据字长、停止位等。支持LIN、IrDA等模式,有DMA及多种中断,适用于多场景高速通信。
    的头像 发表于 05-29 15:44 2068次阅读
    <b class='flag-5'>第二十四章</b> 通用同步异步收发器(USART)

    火力发电厂水汽分析方法 第二十四部分:硫酸铝凝聚剂量的测定(

    火力发电厂水汽分析方法 第二十四部分:硫酸铝凝聚剂量的测定(碱度差法) Analytical methods of steam and water in power plants Part
    发表于 06-08 12:13 20次下载

    模拟电路网络课件 第二十四节:甲乙类互补对称功率放大电路

    模拟电路网络课件 第二十四节:甲乙类互补对称功率放大电路 5.2 甲乙类互补对称功率放大电路 乙类放大电路的失真:
    发表于 09-17 11:14 3322次阅读
    模拟电路网络课件 <b class='flag-5'>第二十四</b>节:甲乙类互补对称功率放大电路

    2022年第二十四届高交会绿色低碳路线

    2022年第二十四届高交会绿色低碳路线 第二十四届中国国际高新技术成果交易会(简称:高交会)于2022年11月15-19日在深圳火热举办中! 本次展会以”科技改革驱动创新,科技创新驱动发展”为主
    发表于 11-17 15:07 750次阅读
    2022年<b class='flag-5'>第二十四</b>届高交会绿色低碳路线

    普渡机器人亮相第二十四届高交会,一起“见圳”科技魅力

    普渡机器人亮相第二十四届高交会,一起“见圳”科技魅力 11月15日,第二十四届中国国际高新技术成功交易会(简称:高交会)在深圳开幕。本届大会以“科技改革驱动创新,科技创新驱动发展”为主题,重点展示了
    的头像 发表于 11-21 17:20 1636次阅读
    普渡机器人亮相<b class='flag-5'>第二十四</b>届高交会,一起“见圳”科技魅力

    第二十四届高交会闭幕,普渡科技获评“最佳品牌奖”

    第二十四届高交会闭幕,普渡科技机器人获评“最佳品牌奖” 备受瞩目的第二十四届中国国际高新技术成果交易会(以下简称高交会)在深圳顺利闭幕。展会期间,普渡科技的精彩亮相吸引了众多展商、观众、媒体记者等
    的头像 发表于 12-13 11:06 1167次阅读
    <b class='flag-5'>第二十四</b>届高交会闭幕,普渡科技获评“最佳品牌奖”

    【参展消息】格瑞普将携创新产品与您相约第二十四届高交会

    参展消息第二十四届中国国际高新技术成果交易会(CHTF2022)(简称:高交会)激发科技活力,展示科技成果来自格瑞普的邀请函2022年第二十四届中国国际高新技术成果交易会,将于本月11月15日-19
    的头像 发表于 11-16 15:33 1330次阅读
    【参展消息】格瑞普将携创新产品与您相约<b class='flag-5'>第二十四</b>届高交会

    华正新材将亮相第二十四届中国国际光电博览会

    第二十四届中国国际光电博览会将于9月6日---8日在深圳宝安会展中心举办,华正新材将亮相第二十四届中国国际光电博览会。 企业简介 浙江华正新材料股份有限公司成立于2003年,是华立集团的控股成员企业
    发表于 08-25 11:25 391次阅读

    普源精电(RIGOL)获颁第二十四届“中国专利金奖”

    2023年10月14日至16日,由国家知识产权局和辽宁省人民政府主办,大连市人民政府承办的第十三届中国国际专利技术与产品交易会暨第二十四届中国专利奖颁奖大会在大连市世界博览广场隆重举办,普源精电(RIGOL)作为第二十四届“中国专利金奖”获奖者,携众多亮眼产品亮相本次会议
    的头像 发表于 10-19 10:20 1068次阅读

    第三章 W55MH32 TCP Client示例

    本文介绍在 W55MH32 芯片上实现 TCP 客户端模式进行数据回环测试的方法。阐述 TCP 协议概念、特点、与 UDP 区别、应用场景及相关机制。展示实现过程,包括开启 Keepalive 功能,在主循环运行测试程序。烧录例
    的头像 发表于 07-24 09:06 766次阅读
    第三章 <b class='flag-5'>W55MH</b>32 <b class='flag-5'>TCP</b> <b class='flag-5'>Client</b><b class='flag-5'>示例</b>

    十四章 W55MH32 TFTP示例

    本文讲解了如何在 W55MH32 芯片上实现 TFTP 协议,通过实战例程详细展示了使用 TFTP 客户端模式从服务器获取文本文件的过程,涵盖 TFTP 初始化、发送读请求、运行协议并处理结果等核心
    的头像 发表于 07-24 10:37 630次阅读
    第<b class='flag-5'>十四章</b> <b class='flag-5'>W55MH</b>32 TFTP<b class='flag-5'>示例</b>

    第二十五章 W55MH32 TCP_Server_Multi_Socket示例

    本文讲解了如何在 W55MH32 芯片上使用 8 个 socket 实现 TCP 服务器模式,让多个客户端连接进行数据回环测试,通过实战例程展示了从初始化 socket 到监听端口、处
    的头像 发表于 07-24 16:10 738次阅读
    <b class='flag-5'>第二十</b>五章 <b class='flag-5'>W55MH</b>32 <b class='flag-5'>TCP_Server_Multi_Socket</b><b class='flag-5'>示例</b>

    第二十六章 W55MH32 上位机搜索和配置示例

    本文讲解了如何在 W55MH32 芯片上实现上位机搜索和配置功能,通过实战例程展示了使用开源上位机配置工具 SmartConfigTool 搜索局域网中的 W55MH32 并进行网络地址配置的过程
    的头像 发表于 07-24 16:13 589次阅读
    <b class='flag-5'>第二十</b>六章 <b class='flag-5'>W55MH</b>32 上位机搜索和配置<b class='flag-5'>示例</b>

    第二十九章 W55MH32 Modbus_TCP_Server示例

    本文讲解了如何在 W55MH32 芯片上实现 Modbus TCP 协议的服务器模式,通过实战例程展示了从初始化 LED 相关函数、主循环调用处理函数到解析处理接收到的报文的完整过程。文章详细介绍了
    的头像 发表于 07-24 16:18 536次阅读
    <b class='flag-5'>第二十</b>九章 <b class='flag-5'>W55MH</b>32 Modbus_<b class='flag-5'>TCP</b>_Server<b class='flag-5'>示例</b>