Node.js 中的 SerialPort 问题:“资源暂时不可用,无法锁定端口”

问题描述 投票:0回答:1

我在 Arch Linux 上的 Node.js 中使用 SerialPort 库时遇到问题。我的目标是打开串行端口,执行操作,然后关闭端口。但是,在执行以下代码时,遇到错误“资源暂时不可用,无法锁定端口”。这是相关代码:

const { SerialPort } = require('serialport')

async function sleep(delay) {
  await new Promise(r => setTimeout(r, delay))
}

async function open() {
  return new Promise((resolve, reject) => {
    const p = new SerialPort({
      path: '/dev/ttyUSB1',
      baudRate: 9600
    }, err => {
      if (err) return reject(err)
      console.log('opened')
      resolve(p)
    }
  )})
}

async function close(port) {
  return new Promise((resolve, reject) => {
    port.close(err => {
      if (err) return reject(err)
      console.log('closed')
      resolve()
    })
  })
}

async function test() {
  let p = await open()
  p.on('data', data => console.log(data.toString()))
  await sleep(5000)
  await close(p)
  p = null
  await sleep(5000)
}

async function main() {
  try {
    await test()
    await test()  
  }
  catch(e) {
    console.log(e.message) 
  }
}

main()


// Output:
// opened
// closed
// Error Resource temporarily unavailable Cannot lock port

第二次打开时发生错误,表明第一个连接尽管已关闭,但仍锁定端口

如果我从测试中删除

p.on('data' ... )
,则不会出现错误,这表明它正在进入“洪水”模式,这会使事情变得混乱。

我错过了什么吗?有人会有什么想法吗?

环境:

  • 操作系统:Arch Linux
  • Node.js 版本:20.8
  • 串口库版本:12
javascript node.js serial-port
1个回答
0
投票

这是自 20.3.0 起与 Node.js 中的 libuv 相关的问题,应自 20.11.1 起修复。

详情请参阅:https://github.com/serialport/node-serialport/issues/2735#issuecomment-1971038083

作为解决方法,您可以在您的环境中设置

UV_USE_IO_URING=0

可以确认它已在当前 Node.js v20.12.2 中修复。

© www.soinside.com 2019 - 2024. All rights reserved.