在 Node.js 中使用串口进行异步/等待

Sci*_*tup 6 serial-port node.js

使用 Node.js 致力于 PC 和基于 Arduino 的硬件之间的通信。最后一个设备是用 G 代码实现的,所以如果我发送 \xe2\x80\x98G0\xe2\x80\x99 我将收到两行;一个用于确认已收到指令,第二个用于确认数据。

\n\n

我想使用 async/await 但出了点问题......代码如下:

\n\n
'use strict'\nconst SerialPort = require('serialport')\nconst Readline = SerialPort.parsers.Readline\n\nconst cardPort = new SerialPort('COM6', {\n    baudRate: 115200,\n    parity: 'none',\n    stopBits: 1,\n    dataBits: 8,\n    flowControl: false,\n    usePromises: true,\n}, function(err) {\n    if (err){\n        console.log('error: ', err.message)\n        port.close()\n    } else {\n\n    }\n})\n\nconst cardParser = new Readline({ delimiter: '\\r\\n' })\n\ncardPort.pipe(cardParser)\n\nfunction checkCard(port, parser){\n    port.write('G0\\n', function () {\n        console.log('message written')\n        parser.on('data', (data) => { \n            console.log(data)\n            return (data)\n        })\n    })\n}\n\nasync function run () {\n    const id = await checkCard(cardPort,cardParser)\n    console.log(`ID response is: ${id}`)\n}\n\nrun()\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我得到的回应:

\n\n
ID response is: undefined\nmessage written\nReceived: G0\nENCR1PT3R!\n
Run Code Online (Sandbox Code Playgroud)\n\n

为什么 ID 响应不等待 checkCard 执行?

\n\n

提前致谢

\n

kid*_*ils 8

checkCard应该返回Promise工作,但看起来port.write是基于回调的。将其封装起来new Promise以使其工作。

function checkCard(port, parser){
    return new Promise(function(resolve, reject) { 
      port.write('G0\n', function () {
        console.log('message written')
        parser.on('data', (data) => { 
            console.log(data)
            resolve(data)
        })
      })
    });      
}
Run Code Online (Sandbox Code Playgroud)