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

OpenWrt环境下Lua将io.open返回的fd添加到uloop时报错如何解决

问题原因

标准Lua io库返回的文件句柄没有提供uloop要求的getfd()方法,无法获取底层的整数文件描述符,因此调用uloop.fd_add()会抛出缺失方法的错误。

解决方案

OpenWrt默认集成nixio库,使用nixio打开文件返回的句柄原生支持getfd()方法,可直接适配uloop的接口要求,修改后可运行的代码如下:

local uloop = require "uloop"
local nixio = require "nixio"

-- 用nixio打开串口设备
local rserial = nixio.open("/dev/ttyUSB2", "r")
-- 示例:配置串口参数为115200波特率、8位数据位、无校验、1位停止位,可按需修改
os.execute("stty -F /dev/ttyUSB2 115200 cs8 -cstopb -parenb")

uloop.init()

local serial_ev = uloop.fd_add(rserial, function(ufd, events)
    -- 读事件触发时执行读取,不会产生阻塞
    local words = ufd:read(1)
    if words then
        print(words)
    end
end, uloop.ULOOP_READ)

uloop.run()
补充说明
  • 若需要继续使用标准io库的句柄,可通过luaposix等第三方库的fileno方法获取到整数文件描述符后,直接传给uloop.fd_add,回调中再对应到原io句柄执行读操作即可。
  • uloop的事件循环已经完成了IO等待的逻辑,读事件触发时再读取数据完全不会阻塞,不需要额外实现阻塞读的监听逻辑。

内容的提问来源于stack exchange,提问作者mao fw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 15:24:07