我在 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' ... )
,则不会出现错误,这表明它正在进入“洪水”模式,这会使事情变得混乱。
我错过了什么吗?有人会有什么想法吗?
环境:
这是自 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 中修复。