使用MicroPython的urequests模块出现OSError: -2问题求助
问题描述
我是新手,尝试用Raspberry Pi Pico连接WiFi网络,从网站获取日期和时间并显示在16x2显示屏上。脚本最初几次运行完全正常,但突然无法工作,出现以下错误:
Traceback (most recent call last):
File "", line 38, in
File "urequests.py", line 180, in get
File "urequests.py", line 76, in request
OSError: -2
使用的代码如下:
import time import network import urequests from machine import I2C, Pin from I2C_LCD import I2CLcd ssidRouter = 'xxxx' #my router name passwordRouter = 'xxxx' #my router password i2c = I2C(1, sda=Pin(14), scl=Pin(15), freq=400000) devices = i2c.scan() led = Pin("LED", Pin.OUT) poop = I2CLcd(i2c, devices[0], 2, 16) def STA_Setup(ssidRouter,passwordRouter): sta_if = network.WLAN(network.STA_IF) if not sta_if.isconnected(): poop.putstr("Connecting") sta_if.active(True) sta_if.connect(ssidRouter,passwordRouter) while not sta_if.isconnected(): led.value(1) time.sleep(0.5) led.value(0) time.sleep(0.5) poop.clear() STA_Setup(ssidRouter,passwordRouter) while True: r = urequests.get("http://date.jsontest.com") ti = r.json()["time"] da = r.json()["date"] poop.move_to(0, 0) poop.putstr("Time:" + ti) poop.move_to(0, 1) poop.putstr(("Date: " + da)) time.sleep(1) r.close()
问题分析与解决办法
错误本质
MicroPython里的OSError: -2通常对应网络连接失败,触发场景包括:
- WiFi连接意外断开(路由器重启、信号衰减)
- 目标测试网站
date.jsontest.com服务不稳定或限流 - 无异常处理导致单次请求失败直接终止脚本
- 请求频率过高被服务器拦截
具体修复步骤
1. 增加WiFi连接状态校验
原代码仅初始化时连接WiFi,后续循环未检查连接状态。修改循环逻辑,每次请求前确认WiFi在线,断开则自动重连:
while True: sta_if = network.WLAN(network.STA_IF) # 检查WiFi连接状态,断开则重连 if not sta_if.isconnected(): poop.clear() poop.putstr("Reconnecting") sta_if.connect(ssidRouter,passwordRouter) while not sta_if.isconnected(): led.value(1) time.sleep(0.5) led.value(0) time.sleep(0.5) poop.clear() # 包裹请求逻辑,捕获异常 try: r = urequests.get("http://date.jsontest.com") ti = r.json()["time"] da = r.json()["date"] poop.move_to(0, 0) poop.putstr("Time:" + ti) poop.move_to(0, 1) poop.putstr("Date: " + da) r.close() except OSError as e: poop.clear() poop.putstr("Net Err") time.sleep(5) # 延长请求间隔,避免限流
2. 添加异常捕获
用try-except包裹网络请求逻辑,即便请求失败也不会直接崩溃,而是在显示屏提示错误,保证脚本持续运行。
3. 降低请求频率
原代码每秒请求一次,过于频繁容易触发服务器限流。把time.sleep(1)改为time.sleep(5)或更长时间,减少请求压力。
4. 更换可靠的时间API
date.jsontest.com是测试服务,稳定性差。可以替换为更可靠的公开API(无需密钥),比如世界时间API:
# 替换请求部分 r = urequests.get("http://worldtimeapi.org/api/ip") data = r.json() ti = data["datetime"].split("T")[1].split(".")[0] # 提取时分秒 da = data["datetime"].split("T")[0] # 提取年月日
5. 排查WiFi信号问题
确保Pico与路由器距离适中,避免信号过弱导致连接不稳定。可以在代码中添加信号强度打印,方便排查:
print("WiFi信号强度(dBm):", sta_if.status('rssi'))
内容的提问来源于stack exchange,提问作者Ryan Whitaker
相关产品推荐
相关产品推荐

