树莓派Pico W使用asyncio.run启动WiFi AP模式报错求助
问题描述
在树莓派Pico W上运行代码时,调用wifi.radio.start_ap()开启WiFi接入点模式,执行asyncio.run(main_loop())时出现报错。尝试使用network模块但不被支持,且调用wifi.radio.connect()时也会进入AP模式。
相关代码:
async def main_loop(): global led,button1 button_task = asyncio.create_task(monitor_buttons(button1)) pico_led_task = asyncio.create_task(blink_pico_w_led(led)) print("Starting Wifi") #startWiFi() import ipaddress # Get wifi details and more from a secrets.py file secrets = { 'ssid' : "wifi", 'password' : "password" } print("Connect wifi") wifi.radio.start_ap(secrets['ssid'],secrets['password']) # Port to listen on print("conesso", wifi.radio.ipv4_address_ap) print("Starting Web Service") webservice_task = asyncio.create_task(startWebService()) await asyncio.gather(pico_led_task, button_task, webservice_task) asyncio.run(main_loop())
解决方案
- 将WiFi AP初始化移到异步函数外同步执行
网络硬件初始化属于阻塞性操作,不适合放在异步任务中执行。把wifi.radio.start_ap()的代码移到asyncio.run()之前,以同步方式完成初始化:
# 先导入所需模块、初始化硬件... # 同步初始化WiFi AP secrets = { 'ssid': "wifi", 'password': "password" } print("Starting Wifi AP") wifi.radio.start_ap(secrets['ssid'], secrets['password']) print("AP IP:", wifi.radio.ipv4_address_ap) async def main_loop(): # 仅创建并等待异步任务,不再包含网络初始化代码 button_task = asyncio.create_task(monitor_buttons(button1)) pico_led_task = asyncio.create_task(blink_pico_w_led(led)) webservice_task = asyncio.create_task(startWebService()) await asyncio.gather(pico_led_task, button_task, webservice_task) asyncio.run(main_loop())
升级CircuitPython版本
旧版本CircuitPython可能存在异步环境下网络操作的兼容性问题,建议升级到最新稳定版(如8.x及以上),确保API和异步逻辑的兼容性。避免STA与AP模式冲突
如果之前调用过wifi.radio.connect()(STA客户端模式),需要先停止STA模式再启动AP:
wifi.radio.stop_station() wifi.radio.start_ap(secrets['ssid'], secrets['password'])
内容的提问来源于stack exchange,提问作者mattia
相关产品推荐
相关产品推荐

