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
相关产品推荐
相关产品推荐

