W55RP20-EVB-MKR 模块 MicroPython 实战 (3):TCP Client 客户端通信

本文为 WIZnet W55RP20 芯片 MicroPython 教程第 3 篇,基于官方最新固件编写,代码均经过实际验证,可直接烧录运行。
版权声明:本文为 WIZnet 官方原创技术文章,转载请注明出处。


前言

上一篇实战教程中,我们已经完成了 W55RP20-EVB-MKRDHCP 自动联网测试,开发板可以通过路由器自动获取 IP 地址,并成功接入局域网。

在完成基础联网后,接下来就可以进行真正的数据通信测试。

本篇内容将介绍 TCP Client 客户端通信。开发板通过 DHCP 获取 IP 地址后,会作为 TCP Client 主动连接电脑端 TCP Server。电脑端发送测试数据后,开发板会接收数据并回发响应内容。

TCP 是一种面向连接的可靠传输协议,适合用于需要稳定数据传输的场景,例如设备状态上报、传感器数据上传、远程控制指令交互等。

W55RP20 集成硬件 TCP/IP 协议栈,配合 MicroPython 的 socket 接口,可以用较少代码实现 TCP Client 通信,无需手动处理底层 TCP 协议细节。

学完本文,你将掌握:

  • TCP Client 与 TCP Server 的基本关系
  • 如何在电脑端开启 TCP Server 测试工具
  • 如何让 W55RP20-EVB-MKR 主动连接 TCP Server
  • 如何通过 TCP 接收电脑端发送的数据
  • 如何将接收到的数据回显给电脑端
  • TCP Client 通信失败时的常见排查方法

系列教程学习路径

本系列共 16 篇,循序渐进覆盖从基础联网到工业级应用的全流程:

  1. 第 1 篇:静态 IP 配置与网络基础
  2. 第 2 篇:DHCP 自动联网与网络诊断
  3. 第 3 篇:TCP Client 客户端通信(本文)
  4. 第 4 篇:TCP Server 服务端通信
  5. 第 5 篇:UDP 单播数据通信
  6. 第 6 篇:UDP 组播/广播数据通信
  7. 第 7 篇:DNS 域名解析
  8. 第 8 篇:NTP 从网络获取时间
  9. 第 9 篇:HTTP Client 客户端请求
  10. 第 10 篇:HTTP Server 服务端搭建
  11. 第 11 篇:HTTP 协议与 OneNET 平台数据上云
  12. 第 12 篇:MQTT 协议基础通信验证
  13. 第 13 篇:MQTT 协议与阿里云平台对接
  14. 第 14 篇:MQTT 协议与 OneNET 平台对接
  15. 第 15 篇:MQTT 协议与 ThingSpeak 平台对接
  16. 第 16 篇:Modbus 工业协议通信

建议收藏本系列,跟随教程逐步学习,所有代码均会同步更新至官方 Gitee 仓库。


目录


1 TCP Client 简介

在嵌入式以太网通信中,设备不仅可以作为 TCP Server 等待连接,也可以作为 TCP Client 主动连接服务器。

TCP Client 通常运行在设备端,由设备主动连接上位机、服务器或云端平台。连接建立成功后,客户端和服务器之间即可进行双向数据通信。


1.1 TCP 是什么

TCP,全称 Transmission Control Protocol,中文通常称为 传输控制协议

TCP 是一种面向连接的可靠传输协议。通信双方在正式传输数据之前,需要先建立连接;连接建立后,双方即可进行稳定的数据收发。

TCP 的特点可以概括为:

特点说明
面向连接通信前需要先建立连接
可靠传输适合需要稳定传输的应用场景
双向通信连接建立后,客户端和服务器都可以收发数据
应用广泛常用于上位机通信、服务器通信、云端通信等场景

1.2 TCP Client 与 TCP Server 的关系

TCP 通信通常由 Client 和 Server 两个角色组成。

角色说明
TCP Server监听指定 IP 和端口,等待客户端连接
TCP Client主动连接 TCP Server 的 IP 和端口
连接建立后双方都可以发送和接收数据

简单来说:

TCP Server:先启动,等待客户端连接
TCP Client:主动连接 TCP Server

1.3 TCP Client 工作流程

TCP Client 的通信过程如下图所示:

在这里插入图片描述

从流程可以看到,TCP Client 的核心就是:创建 Socket、主动连接服务器,并在连接成功后进行数据收发。


1.4 TCP Client 的优点

TCP Client 基于 TCP 协议进行通信,具备可靠、有序、双向通信等特点,适合需要稳定连接的嵌入式网络应用。

优点说明
主动连接设备可以主动连接上位机、服务器或云端平台
通信稳定基于 TCP 可靠连接进行数据收发
双向通信连接建立后,Client 和 Server 都可以收发数据
易于调试可以通过 SocketTester 等工具快速验证通信结果
应用广泛适用于数据上传、远程控制、设备状态上报等场景

对于嵌入式设备来说,TCP Client 常用于“设备主动连接服务器”的场景。例如设备上电后主动连接上位机或云端服务器,然后上传数据或接收服务器下发的控制指令。


2 准备工作

2.1 软件准备

软件名称版本要求下载地址说明
Thonny4.0 及以上Thonny 官方下载用于编辑、运行 MicroPython 程序
W55RP20 MicroPython 固件最新稳定版WIZnet 官方资料页面W55RP20-EVB-MKR 对应 MicroPython 固件
SocketTesterv1.0.0.5SocketTester 下载用于在电脑端作为 TCP Server 等待开发板连接

2.2 硬件准备

如图所示,W55RP20-EVB-MKR 开发板实物图。

在这里插入图片描述
需要准备以下硬件:

  • W55RP20-EVB-MKR开发板 × 1
  • USB 数据线(必须支持数据传输,不能使用纯充电线) × 1
  • 标准网线 × 1
  • 路由器或交换机 × 1

W55RP20-EVB-MKR已板载以太网接口,无需额外焊接飞线其他器件,即插即用。
大幅降低了接线错误和硬件故障概率。


3 烧录 W55RP20 专属 MicroPython 固件

W55RP20 完全兼容树莓派 Pico 的 UF2 固件烧录方式,操作简单无需额外烧录器:

  1. 按住 W55RP20-EVB-MKR 上的 BOOTSEL 按键不放

  2. 使用 Micro USB 数据线连接开发板与电脑

  3. 待电脑识别出名为 RPI-RP2 的 U 盘后,松开 BOOTSEL 按键

  4. 将下载好的 W55RP20_firmware.uf2 固件文件拖拽到 U 盘中

  5. 开发板会自动重启,固件烧录完成

注意:如果电脑没有识别出 RPI-RP2 U 盘,请尝试更换 USB 数据线、重新插拔开发板,或更换电脑 USB 接口。


4 硬件连接与开发环境配置

4.1 硬件连接

W55RP20-EVB-MKR 的连接非常简单,仅需两步:

  1. 使用USB数据线连接开发板与电脑,用于供电、代码烧录和串口调试

  2. 使用网线连接开发板的以太网接口与路由器的 LAN 口

如图所示为硬件连接示意图

在这里插入图片描述

4.2 Thonny 开发环境配置

  1. 打开 Thonny 软件,点击顶部菜单栏「运行」→「配置解释器」

  2. 切换到「解释器」选项卡

  3. 在「解释器」下拉列表中选择 MicroPython(通用)

  4. 在「端口」下拉列表中选择 W55RP20-EVB-MKR 对应的串口(通常显示为 Board CDC @ COMx

  5. 勾选「运行代码前先重启解释器」和「同步设备的实时时钟」

  6. 点击「确定」完成配置

如果端口列表中没有出现开发板,请尝试:

  • 重新插拔 USB 数据线
  • 更换支持数据传输的 USB 数据线
  • 关闭其他占用串口的软件(如串口助手、Arduino IDE 等)
  • 重新烧录 MicroPython 固件

5 SocketTester 配置

电脑端需要先启动 TCP Server,等待开发板连接。

打开 SocketTester 后,按照以下方式配置:

参数设置
ProtocolTCP server
Local IP address192.168.1.119
Listen port number8082
Decode asASCII
Encode asASCII

配置完成后,点击监听按钮,使电脑端进入 TCP Server 等待连接状态。

注意:Local IP address 需要选择电脑当前所在局域网的 IP 地址,本文实验中为 192.168.1.119
Listen port number 需要和开发板代码中的 PC_PORT 保持一致,本文实验中为 8082

SocketTester 配置界面如下图所示:
在这里插入图片描述

6 TCP Client 示例代码

6.1 完整代码

打开 TCP Client 示例文件,或在 Thonny 中输入以下代码:

from wiznet_init import wiznet
import usocket as socket
import time

# 初始化 W55RP20-EVB-MKR 网络
# dhcp=True 表示通过路由器自动获取 IP 地址
nic = wiznet("W55RP20-EVB-MKR", dhcp=True)

# 打印开发板当前 IP 地址
print("IP:", nic.ifconfig()[0])

# 电脑端 TCP Server 的 IP 地址和监听端口
PC_IP = "192.168.1.119"
PC_PORT = 8082

while True:
    s = None

    try:
        # 创建 TCP Socket
        s = socket.socket()

        # 主动连接电脑端 TCP Server
        print("准备连接电脑...")
        s.connect((PC_IP, PC_PORT))
        print("已连接电脑,等待电脑发送数据...")

        while True:
            # 接收电脑端发送的数据,最大接收 1024 字节
            data = s.recv(1024)

            # 如果没有接收到数据,说明电脑端可能已经断开连接
            if not data:
                print("电脑主动断开")
                break

            # 打印接收到的数据
            print("收到指令:", data)

            # 组织回复数据
            reply = b"Client echo: " + data

            # 将回复数据发送给电脑端 TCP Server
            s.send(reply)
            print("已回复:", reply)

    except Exception as e:
        # 如果连接失败或通信异常,打印异常信息
        print("连接失败或断开:", repr(e))

    try:
        # 关闭当前 Socket
        if s:
            s.close()
    except:
        pass

    # 等待 2 秒后重新尝试连接
    time.sleep(2)

6.2 关键函数说明

本例程中 TCP Client 的核心函数如下:

函数/语句作用
socket.socket()创建 TCP Socket
s.connect((PC_IP, PC_PORT))主动连接电脑端 TCP Server
s.recv(1024)接收服务器发送的数据
s.send(reply)向服务器发送回复数据
s.close()关闭当前 Socket

其中 connect() 会主动连接电脑端 TCP Server,recv() 会阻塞等待电脑端发送数据。


7 运行结果与通信验证

完成 SocketTester 配置并运行 TCP Client 示例程序后,可以通过 Thonny Shell 和 SocketTester 窗口观察通信结果。


7.1 Thonny 串口输出结果

运行程序后,Thonny Shell 输出如下:

>>> %Run -c $EDITOR_CONTENT

MPY: soft reboot
Waiting for the network to connect...
Waiting for the network to connect...
Waiting for the network to connect...
Waiting for the network to connect...
MAC Address: 02:90:86:88:4d:56
IP Address: ('192.168.1.123', '255.255.255.0', '192.168.1.1', '202.96.134.33')
IP: 192.168.1.123
准备连接电脑...
连接失败或断开: OSError(104,)
准备连接电脑...
已连接电脑,等待电脑发送数据...
收到指令: b'hello'
已回复: b'Client echo: hello'

从运行结果可以看到,开发板通过 DHCP 获取到 IP 地址 192.168.1.123,并主动连接电脑端 TCP Server。

电脑端 SocketTester 作为 TCP Server,监听地址和端口为:

192.168.1.119:8082

随后电脑端发送 hello,开发板收到 b'hello',并回发 b'Client echo: hello',说明 TCP Client 通信成功。

说明:首次出现 连接失败或断开: OSError(104,) 通常是因为电脑端 TCP Server 尚未完全处于监听状态,或上一次连接未完全释放。程序会在 2 秒后自动重新连接,后续连接成功后即可正常收发数据。


7.2 SocketTester 接收结果

电脑端 SocketTester 发送框中输入:

hello

点击 Send 后,开发板会收到该数据,并回发:

Client echo: hello

SocketTester 接收窗口可以看到:

Client echo: hello

实际运行效果如下图所示,左侧为 Thonny 运行日志,右侧为 SocketTester TCP Server 收发数据窗口。

在这里插入图片描述

从截图可以看到,开发板已成功连接电脑端 TCP Server,并完成 hello 数据接收与 Client echo: hello 回显验证。


7.3 TCP Client 通信视频演示

下面的视频展示了 W55RP20-EVB-MKR 作为 TCP Client 连接电脑端 TCP Server,并完成数据回显的过程。

在这里插入图片描述


8 常见问题一站式排查指南

8.1 电脑端 TCP Server 未开启

问题现象排查步骤
开发板一直打印 连接失败或断开
1. 确认 SocketTester 已选择 TCP server
2. 确认电脑端已经点击监听按钮
3. 确认 SocketTester 中显示有监听状态
4. 确认端口号和代码中的 PC_PORT 一致

8.2 PC_IP 或端口填写错误

问题现象排查步骤
开发板无法连接电脑
1. 确认 PC_IP 是电脑当前局域网 IP
2. 确认 PC_PORT 与 SocketTester 监听端口一致
3. 确认电脑和开发板连接到同一路由器
4. 确认电脑防火墙没有阻止 TCP 连接

本文代码中的电脑 IP 和端口为:

PC_IP = "192.168.1.119"
PC_PORT = 8082

如果你的电脑 IP 或端口不同,需要按实际情况修改。


8.3 出现 OSError(104)

运行过程中如果看到:

连接失败或断开: OSError(104,)

通常表示 TCP 连接被对端关闭,或电脑端 TCP Server 尚未准备好。

可以尝试:

  • 确认 SocketTester 已经开始监听
  • 关闭并重新打开 SocketTester
  • 重新运行开发板程序
  • 等待程序自动重连
  • 检查是否有上一次连接未完全释放

如果后续可以重新连接成功,并正常出现:

已连接电脑,等待电脑发送数据...
收到指令: b'hello'
已回复: b'Client echo: hello'

则说明 TCP Client 通信已经成功。


8.4 程序卡在 recv()

代码中的:

data = s.recv(1024)

是阻塞等待接收数据。

如果电脑端不发送数据,程序会一直停在这里,这是正常现象,并不是死机。

解决方法:

  1. 在 SocketTester 的发送框中输入数据,例如 hello
  2. 确认 Connected clients list 中选择 Send to all (1)
  3. 点击 Send
  4. 查看 Thonny 是否打印收到的数据

8.5 电脑端收不到回复

如果开发板已经收到数据,但电脑端 SocketTester 没有显示回复,可以检查:

  • SocketTester 是否勾选了 Don't log data
  • SocketTester 接收区是否被清空
  • Decode as 是否选择为 ASCII
  • 开发板代码中是否执行了 s.send(reply)
  • TCP 连接是否已经断开

电脑端正常收到回复时,应显示:

Client echo: hello

9 W55RP20 核心优势对比

为了让你更直观地了解 W55RP20 的价值,我们对比了目前主流的三种嵌入式以太网方案:

对比维度W55RP20 集成方案外接 PHY 芯片方案外接串口转以太网模块方案
BOM 成本
(单芯片)
中高
(MCU + 模块 + 外围器件)
PCB 面积
(仅需网口电路)

(需预留芯片和布线空间)
开发难度
(一行代码联网)
中高
(调试协议栈、编写驱动)
网络稳定性极高
(WIZnet 专注硬件 TCP/IP 协议栈 25 年)
不定
(对于研发人员要求高,熟悉协议栈与网络开发,才能调试稳定)
不定
(视研发公司能力水平)
CPU 资源占用0%
(协议栈网络处理完全由硬件完成)
50% 以上
(协议栈完全运行在 MCU 上,占用相关资源)
0%
硬件 Socket 数量8 个独立硬件 Socket视 MCU 能力而定,理论支持多路拓展一般为单路透传
网络吞吐量最高 15Mbps视 MCU 能力而定约 3-5Mbps
接口易用性单芯片集成要 MCU 带有 MII/RMII 等接口TTL 接口
部署难度
(MicroPython 成熟固件,应用层协议绝大部分均有库文件,可灵活添加部署)

(应用层协议需要手动移植开源库适配)
视模块集成情况,无集成的功能需要自我封包拆包

10 典型应用场景

W55RP20 芯片集成以太网功能,结合其工业级稳定性,非常适合以下应用场景:

  1. 工业数据采集网关: 简化现场部署,实现传感器数据的稳定上传

  2. 远程监控终端: 用于工厂、机房、变电站等环境的设备状态远程监控

  3. 串口转网口设备: 将传统 RS232/RS485 串口设备快速升级为以太网设备

  4. 智能楼宇节点: 用于照明、空调、门禁等楼宇设备的网络控制

  5. 工业 PLC 扩展模块: 为 PLC 增加以太网通信能力,实现远程编程和数据采集


11 系列预告与资源获取

11.1 系列预告

下一篇教程将讲解 W55RP20 MicroPython 开发下的 TCP Server 服务端通信

与 TCP Client 主动连接服务器不同,TCP Server 会在开发板端监听指定端口,等待电脑或其他客户端主动连接。


11.2 资源获取

下一篇我们讲解:W55RP20-EVB-MKR 模块 MicroPython 实战 (4):TCP Server 服务端通信

如果本文对你有帮助,欢迎点赞、收藏、关注,你的支持是我们持续更新的动力!

如有任何问题,欢迎在评论区留言,我们会第一时间回复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值