You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 15:25:22