Node.js 发送消息并在节点serialport中等待响应

Node.js 发送消息并在节点serialport中等待响应,node.js,readline,node-streams,node-serialport,Node.js,Readline,Node Streams,Node Serialport,我有一个设备,使用串行接口通过USB连接到计算机。 我可以使用以下代码正确地“交谈”: const SerialPort = require('serialport'); const ReadLine = require('@serialport/parser-readline'); function handleResponse(data) { console.log('Rx', data); console.log(); } SerialPort.list() .then(a

我有一个设备,使用串行接口通过USB连接到计算机。 我可以使用以下代码正确地“交谈”:

const SerialPort = require('serialport');
const ReadLine = require('@serialport/parser-readline');

function handleResponse(data) {
  console.log('Rx', data);
  console.log();
}

SerialPort.list()
  .then(async portInfos => {
    portInfos.filter(pinfo => pinfo.manufacturer === 'FTDI')
      .forEach(async portInfo => {
        const port = new SerialPort(portInfo.path).setEncoding('ascii');

        const parser = port.pipe(new ReadLine({
          delimiter: '\r\n',
          encoding: 'ascii',
        }));
        parser.on('data', handleResponse);

        port.open();

        const serialMessage = api.createReadMessage(SERIAL);
        const batteryMessage = api.createReadMessage(BATTERY);

        for (const m of [serialMessage, batteryMessage]) {
          console.log('Tx', m.trim());
          port.write(m);
        }
      });
  });
我的目的是获得以下输出:

  Tx :0A0300070004E8
  Rx :0A030800000467000000017F
  
  Tx :0A03000B0002E6
  Rx :0A03040064006427
但我得到的却是这个:

  Tx :0A0300070004E8
  Tx :0A03000B0002E6
  Rx :0A030800000467000000017F
  
  Rx :0A03040064006427
这是因为第二条Tx消息在第一条Rx消息接收之前发送,因为接收是异步/事件驱动的

我要找的是:

function sendAndReceive(messageToSend, port) {
  port.write(messageToSend);
  const response = port.readLine(); // BLOCKING, PERHAPS WITH TIMEOUT EXCEPTION;
  return response;
}

for (const m of [serialMessage, batteryMessage]) {
  console.log('Tx', m.trim());
  const response = sendAndReceive(m);
  console.log(response);
}
我在npm上寻找了一些“readliney”包(
node-byline
linebyline
,以及本机的
readline
模块),但它们似乎都依赖于
stream.on
事件,而这不是我想要的(serialport readline解析器已经做到了这一点)


是否有任何与流api兼容的函数允许我执行此操作?

看起来您可以轮询
SerialPort.read()
来实现。下面是一些未经测试的伪代码:

函数发送和接收(messageToSend,端口){
port.write(messageToSend);
让反应='';
while(true){
response=port.read();//阻塞,可能有超时异常;
if(响应!=null){
打破
}
睡眠(1000);
}
返回响应;
}
功能睡眠(ms){
返回新承诺(解决=>{
设置超时(解析,毫秒)
})
}
受此启发: