Node.js SerialPort报错:Resource temporarily unavailable Cannot lock port 求助
解决思路与方案
问题核心是添加data事件监听后,SerialPort内部的读取流未被正确销毁,导致端口资源未完全释放——即使调用port.close(),底层文件描述符仍被占用,无法获取端口锁。
方案1:关闭前清理监听与流
在关闭端口前,移除所有data事件监听并销毁读取流,确保资源完全释放:
async function close(port) { return new Promise((resolve, reject) => { // 移除data事件监听 port.removeAllListeners('data'); // 销毁读取流 if (port.readable) { port.destroy(); } port.close(err => { if (err) return reject(err) console.log('closed') resolve() }) }) }
方案2:先刷新缓冲区再关闭
关闭前调用flush()处理完缓冲区数据,避免流处于活跃状态:
async function close(port) { return new Promise((resolve, reject) => { port.flush(flushErr => { if (flushErr) return reject(flushErr); port.removeAllListeners('data'); port.close(err => { if (err) return reject(err) console.log('closed') resolve() }) }) }) }
方案3:限制监听生命周期
如果不需要持续监听,改用once('data')单次监听,或在数据处理后立即移除监听:
async function test() { let p = await open() // 仅监听一次数据 p.once('data', data => console.log(data.toString())) await sleep(5000) await close(p) p = null await sleep(5000) }
方案4:检查系统权限
确保当前用户拥有串口设备的读写权限,将用户加入uucp组:
sudo usermod -aG uucp $USER
修改后需重新登录生效,避免因权限问题导致端口锁无法正常释放。
内容的提问来源于stack exchange,提问作者Fred
相关产品推荐
相关产品推荐

