2015-08-04 5 views
0

Я хочу, чтобы запустить эти три действия в упорядоченно:синхронные действия в узле JS

  1. Открытие последовательного порта
  2. Прослушивание любых изменений
  3. Отправка команд через последовательный порт

Проблема связана с асинхронностью узла 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) 
    }) 
}); 
+0

Похоже, вы покорно ожидаете открытия порта. Есть примечание о том, что версии узлов выше 0.11.10 не поддерживаются, какая версия узла вы используете? – trex005

+0

Версия узла js равна 0.12.7 –

ответ

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

1) в документации говорится, что не устанавливать слушателей перед открытием (https://github.com/voodootikigod/node-serialport#open-event) 2) это не будет записать исходные данные OPs до тех пор, пока не будут получены данные 3) это будет записывать начальные данные OPs КАЖДОЕ время, когда были получены данные – trex005

+0

@trex - 1), как я писал в ответ, я не знаком с этим модулем, но так как вы (замечательно, что вы сделали BTW), тогда «* установка« данных »слушателей и запись до того, как открытое событие может привести к ... ничего вообще *» (выглядит очень безопасно для меня). 2, 3). Я вижу, что не понял намерений в вопросе. исправление ... – Amit

+0

1) да, вы были понятны, просто помогали 2) OP хотел, чтобы порт слушал, но у нас нет причин полагать, что он передал бы любые данные. 3) :) – trex005

Смежные вопросы