последовательный порт javascript: как ждать ответа? - PullRequest
0 голосов
/ 10 марта 2019

Как правильно выбрать, чтобы программа javascript отправляла последовательную команду (RS232) и ждала ответа? Этот скрипт моделирует то, что я пытаюсь сделать:

var serialport = require('serialport');
var readCount = 0;
function showPortOpen() {
    console.log('port open. Data rate: ' + myPort.baudRate);
}
function readSerialData(data) {
    readCount += 1;
    console.log(data);
}
function showPortClose() {
    console.log('port closed.');
}
function showError(error) {
    console.log('Serial port error: ' + error);
}

global.myPort = new serialport("COM4", { baudRate: 115200 });
global.parser = new serialport.parsers.Readline(); // make a new parser to read ASCII lines
global.myPort.pipe(global.parser); // pipe the serial stream to the parser
global.myPort.on('open', showPortOpen);
global.parser.on('data', line => console.log(`> ${line}`))
global.myPort.on('close', showPortClose);
global.myPort.on('error', showError);
global.myPort.write("Hello!\r\n");

function serialWriteAndWait(pData){
    global.myPort.write(pData);
    var start = readCount;
    console.log("Sending: ");
    while(readCount == start)   ; // WAIT LOOP
    console.log("Returned");
}

serialWriteAndWait("Enter CRLF");

console.log("Press ^C to exit.")

Где readCount - семафор с низкой арендной платой. Идея состоит в том, что обратный вызов приема увеличивает значение, и основной код выходит из цикла WAIT LOOP. Даже если все это плохо (из-за информатики), проблема в том, что WAIT LOOP блокируется так сильно, что последовательный код никогда не запускается. Он никогда даже не отправляет Hello на последовательный порт.

>node serialwait.js
Sending:

С закомментированной строкой WAIT LOOP запускается серийный код, но, конечно, нет WAIT:

>node serialwait.js
Sending:
Returned
Press ^C to exit.
port open. Data rate: 115200
>
> 121212

Я пробовал рабочие потоки, фоновый процесс и немедленно. Либо я не могу заставить их работать, либо WAIT блокирует последовательный код, поэтому ничего не происходит.

Как правильно сделать это в JavaScript? Я использую node.js v11.10.1 на Win10.

В случае, если это имеет значение, миссия состоит в том, чтобы написать тестовый стенд для сценариев, которые производятся извне. Сценарии обычно выполняются в другой среде для взаимодействия с устройствами RS232. Таким образом, в реальном коде serialWriteAndWait вызывается другим модулем, который запускается с вызовом Require. Скрипт ожидает, что результат будет готов к концу вызова. Я не могу ни изменить это требование, ни отредактировать внешний скрипт для правильного асинхронного поведения. Мне нужно найти правильный способ поддержать это.

...