MicroPython与CircuitPython环境下Wiznet5500 HTTP GET请求延迟问题
W5500以太网模块请求延迟过高解决方法
核心问题排查点
- 硬件初始化逻辑错误:当前代码将SPI总线初始化、W5500实例化、网络配置逻辑全部放在while死循环内部,每次执行请求都会重新初始化硬件、重新进行以太网链路协商,这是最核心的耗时原因,将这部分代码迁移到循环外部,仅执行一次初始化即可。
- SPI总线速率未指定:adafruit的W5500驱动默认SPI时钟速率较低,W5500最高支持80MHz SPI通信,树莓派Pico可稳定运行在30MHz以上速率,初始化SPI时手动指定
frequency参数即可大幅提升收发效率。 - DNS解析延迟:请求私有业务API耗时长达1分钟大概率是DNS解析超时导致,你可以先用IP地址代替域名测试验证,如果使用IP后耗时恢复正常,手动指定W5500的DNS服务器地址即可,例如配置为公共DNS
8.8.8.8或者你本地网络的DNS地址。 - TCP参数配置不合理:W5500默认的TCP重传超时、窗口大小配置可能不适配你的网络环境,手动设置socket默认超时时间,避免异常情况下的长时间等待。
修正后测试代码
import board import busio import digitalio import adafruit_requests as requests from adafruit_wiznet5k.adafruit_wiznet5k import WIZNET5K import adafruit_wiznet5k.adafruit_wiznet5k_socket as socket import gc from machine import UART,Pin import time print("Wiznet5k WebClient Test") # 硬件初始化移到循环外,仅执行一次 JSON_URL = "http://jsonplaceholder.typicode.com/todos/1" cs = digitalio.DigitalInOut(board.GP13) # 手动指定SPI速率为30MHz spi_bus = busio.SPI(board.GP10, MOSI=board.GP11, MISO=board.GP12, frequency=30_000_000) eth = WIZNET5K(spi_bus,cs) # 手动指定DNS服务器 eth.dns = ("8.8.8.8", "114.114.114.114") requests.set_socket(socket, eth) # 设置socket超时时间为5秒 socket.setdefaulttimeout(5) uart = UART(0, rx=Pin(1), tx=Pin(0), baudrate=115200,rxbuf=512) while True: # Wiznet5k请求逻辑 print("Fetching json from", JSON_URL) r = requests.get(JSON_URL) print(r.json()) r.close() gc.collect() print("Wiznet5k Done!") # ESP01请求逻辑 time.sleep(1) gc.collect() uart.write("https://jsonplaceholder.typicode.com/todos/1\n") gc.collect() print(uart.read()) print("ESP01 Done!")
额外验证步骤
如果以上修改完成后延迟仍然偏高,可按顺序验证:
- 检查W5500硬件接线,SPI的CS、CLK、MOSI、MISO引脚尽量不要有飞线过长的情况,避免信号干扰
- 测试直连PC主机搭建的本地HTTP服务,排除公网路由转发的影响
- 替换为最新版本的adafruit_wiznet5k驱动,旧版本驱动存在TCP收发逻辑冗余的已知问题
内容的提问来源于stack exchange,提问作者Tryingtogetsome
相关产品推荐
相关产品推荐

