让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调用运行的模块调用。该脚本期望在调用返回时结果准备就绪。我无法更改该要求,也无法编辑外部脚本以实现正确的异步行为。我需要找到正确的方法来支持它。