async / await使用node.js中的serialport

时间:2018-06-14 12:28:50

标签: node.js serial-port

使用Node.js处理PC与基于Arduino的硬件之间的通信。最后一个设备是用G-Code实现的,所以如果我发送'G0',我将收到两行;一个用于确认已收到指令,另一个用于确认数据。

我想使用async / await但是出了点问题......这里是代码:

'use strict'
const SerialPort = require('serialport')
const Readline = SerialPort.parsers.Readline

const cardPort = new SerialPort('COM6', {
    baudRate: 115200,
    parity: 'none',
    stopBits: 1,
    dataBits: 8,
    flowControl: false,
    usePromises: true,
}, function(err) {
    if (err){
        console.log('error: ', err.message)
        port.close()
    } else {

    }
})

const cardParser = new Readline({ delimiter: '\r\n' })

cardPort.pipe(cardParser)

function checkCard(port, parser){
    port.write('G0\n', function () {
        console.log('message written')
        parser.on('data', (data) => { 
            console.log(data)
            return (data)
        })
    })
}

async function run () {
    const id = await checkCard(cardPort,cardParser)
    console.log(`ID response is: ${id}`)
}

run()

这是我得到的回应:

ID response is: undefined
message written
Received: G0
ENCR1PT3R!

为什么ID响应在执行checkCard之前不会等待?

提前致谢

1 个答案:

答案 0 :(得分:1)

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)
        })
      })
    });      
}