Как правильно выбрать, чтобы программа 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. Скрипт ожидает, что результат будет готов к концу вызова. Я не могу ни изменить это требование, ни отредактировать внешний скрипт для правильного асинхронного поведения. Мне нужно найти правильный способ поддержать это.