【问题标题】:Fiber Error with npm package serial-port with meteor带有流星的 npm 包串行端口的光纤错误
【发布时间】:2015-08-16 19:59:11
【问题描述】:

我正在使用带有流星的 SerialPort npm 包。我使用 wrapAsync 列出串行端口,但我不知道如何使用 serialPort.on 方法。 当我想在我的 Cars 集合中插入数据时出现错误:

Meteor 代码必须始终在 Fiber 中运行。尝试包装回调 使用 Meteor.bindEnvironment 传递给非 Meteor 库。

代码:

Meteor.startup(function () {
  SerialPort = Meteor.npmRequire('serialport');
  // Wrap method SerialPort.list to call it Synchronously
  listSerialPorts = function(callback) {
    SerialPort.list(function (err, ports) {
      callback(null, ports);
    });  
  }
  // Reset cars collection

});



Meteor.methods({
  serialPortsRefresh: function () {
    // TODO : problem when several arduinos ?
    Config.remove({key:'serialPorts'});
    // Call SerialPort.list
    var asyncListSerialPorts = Meteor.wrapAsync(listSerialPorts);
    var resultsListSerialPorts = asyncListSerialPorts();
    // Insert results in database
    var configSerialPorts = {key: "serialPorts", value: resultsListSerialPorts[0].comName };
    Config.insert(configSerialPorts);
  },
  // Connect Serial port
  serialPortConnect: function (port) {
    // debugger;
    // serialPort = new SerialPort(port.value, {baudrate: 9600});
    serialPort = new SerialPort.SerialPort("/dev/ttyUSB0", {baudrate: 9600, parser: SerialPort.parsers.readline("\n")});
    // connectSerialPort(port);
    serialPort.on('open', function() {
        console.log('Port ' + port.value + ' open');
    });    
    serialPort.on('data', function(data) {
          dispatchMessages(data);
        //Watchdog.insert({key: "Receiving data", value: data })
    });  
    sendToArduino = function(message) {
      console.log(message);
      serialPort.write(message);
    };      
    dispatchMessages = function(data) {
      console.log(data);
      //Split data
      var datas = data.split(" ");
      if (datas[1] == "OK") {
        console.log("Car " + datas[0] + " is here");
        // Add car to database
        Cars.insert({
          cid: datas[0],
          active: true
        });
      }

    };    
  },  
  // Ping bridge
  ping: function () {
    sendToArduino("LED13\n");
  }    


});

【问题讨论】:

    标签: javascript meteor node-fibers node-serialport


    【解决方案1】:

    问题是您传递给serialPort.on 的回调在被调用时不会在与您的方法相同的光纤中运行。事实上,它们根本不会在光纤中运行,除非你适当地包裹它们。

    Meteor.bindEnvironment 在 Fiber 中运行传递的函数,但也在周围环境中复制,这是必要的,因为 Meteor 在当前 Fiber 中存储了运行相关回调可能需要的各种变量。

    所以,如果你这样做,它应该可以工作:

    serialPort.on('open', Meteor.bindEnvironment(function() {
        // Wrapping this one is unnecessary at present as it doesn't
        // do anything that needs to be run in a fiber, but you should
        // probably wrap it anyway so that you can safely add more code
        // if required.
        console.log('Port ' + port.value + ' open');
    }, function(e) {
        // This is an error-handler - you don't have to pass one, but
        // if you don't it can make debugging a nightmare.
        throw e;
    }));    
    serialPort.on('data', Meteor.bindEnvironment(function(data) {
        dispatchMessages(data);
        //Watchdog.insert({key: "Receiving data", value: data })
    }, function(e) {
        throw e;
    }));  
    

    请注意,您还需要将回调包装在回调等中,这可能会变得非常冗长(并且将 var mBE = Meteor.bindEnvironment 之类的内容放在方法文件的顶部是个好主意)。

    【讨论】:

    • 非常感谢!不知道我是否已经抓住了一切,但它只是在工作:)
    猜你喜欢
    • 1970-01-01
    • 2013-12-05
    • 2014-07-30
    • 1970-01-01
    • 2012-12-01
    • 2015-12-21
    • 2013-10-04
    • 2015-09-22
    • 1970-01-01
    相关资源
    最近更新 更多