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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 11:52:51