节点js中的同步动作

时间:2015-08-04 12:25:46

标签: node.js serial-port

我想以有序的方式运行这三个动作:

  1. 打开串口
  2. 聆听任何变更
  3. 通过串口发送命令
  4. 问题是由于节点js的异步性,有时数据是在端口开始侦听之前发送的。因此,这些数据丢失了。这是我的示例代码。我该如何解决这个问题?

    var SerialPort = require("serialport").SerialPort
    var serialPort = new SerialPort("COM27", {
      baudrate: 57600
    }, false); // this is the openImmediately flag [default is true]
    
    //***1***open the serialport
    serialPort.open(function (error) {
      if ( error ) {
        console.log('failed to open: '+error);
      }
      else {
        console.log('open');
      }
    
      //***2***port is now listening
      serialPort.on('data', function (data) {
        console.log('data received: ' + data)
      })
    
      //***3***send command using serialport
      serialPort.write("AJ+APN?\n", function(err, results) {
        console.log('err ' + err);
        console.log('results ' + results)
      })
    });
    

2 个答案:

答案 0 :(得分:0)

我不知道您正在使用的serialport模块,但如果它的行为方式是“标准”:

var SerialPort = require("serialport").SerialPort
var serialPort = new SerialPort("COM27", { baudrate: 57600 }, false);

//***1*** listen for events on port
serialPort.on('data', function (data) {
  console.log('data received: ' + data);

//***2*** open the serialport
serialPort.open(function (error) {
  if ( error ) {
    console.log('failed to open: '+error);
  } else {
    console.log('open');

    //***3*** send command using serialport -> after port opened
    serialPort.write("AJ+APN?\n", function(err, results) {
      console.log('err ' + err);
      console.log('results ' + results)
    });
  }
});

答案 1 :(得分:0)

为应该在系列中执行的每个任务创建一个承诺。然后它应该按照要求的顺序简单地链接承诺。