javascript串行端口:如何等待回复?

时间:2019-03-09 23:33:01

标签: javascript node.js concurrency serial-port blocking

让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是低租金信号量。这个想法是,receive回调会增加该值,并且主代码会脱离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

我已经尝试了工作线程,后台进程以及即时线程。我要么无法使它们工作,要么等待阻止了串行代码,所以什么也没发生。

在javascript中实现此目标的正确方法是什么?我在Win10上使用的是node.js v11.10.1。

万一重要,我们的任务是为外部生成的脚本编写一个测试台。这些脚本通常在不同的环境中运行以与RS232设备进行交互。因此,在实际代码中,serialWriteAndWait由另一个通过Require调用运行的模块调用。该脚本期望在调用返回时结果准备就绪。我无法更改该要求,也无法编辑外部脚本以实现正确的异步行为。我需要找到正确的方法来支持它。

0 个答案:

没有答案