Node.js 发送消息并在节点serialport中等待响应
我有一个设备,使用串行接口通过USB连接到计算机。 我可以使用以下代码正确地“交谈”:Node.js 发送消息并在节点serialport中等待响应,node.js,readline,node-streams,node-serialport,Node.js,Readline,Node Streams,Node Serialport,我有一个设备,使用串行接口通过USB连接到计算机。 我可以使用以下代码正确地“交谈”: const SerialPort = require('serialport'); const ReadLine = require('@serialport/parser-readline'); function handleResponse(data) { console.log('Rx', data); console.log(); } SerialPort.list() .then(a
const SerialPort = require('serialport');
const ReadLine = require('@serialport/parser-readline');
function handleResponse(data) {
console.log('Rx', data);
console.log();
}
SerialPort.list()
.then(async portInfos => {
portInfos.filter(pinfo => pinfo.manufacturer === 'FTDI')
.forEach(async portInfo => {
const port = new SerialPort(portInfo.path).setEncoding('ascii');
const parser = port.pipe(new ReadLine({
delimiter: '\r\n',
encoding: 'ascii',
}));
parser.on('data', handleResponse);
port.open();
const serialMessage = api.createReadMessage(SERIAL);
const batteryMessage = api.createReadMessage(BATTERY);
for (const m of [serialMessage, batteryMessage]) {
console.log('Tx', m.trim());
port.write(m);
}
});
});
我的目的是获得以下输出:
Tx :0A0300070004E8
Rx :0A030800000467000000017F
Tx :0A03000B0002E6
Rx :0A03040064006427
但我得到的却是这个:
Tx :0A0300070004E8
Tx :0A03000B0002E6
Rx :0A030800000467000000017F
Rx :0A03040064006427
这是因为第二条Tx消息在第一条Rx消息接收之前发送,因为接收是异步/事件驱动的
我要找的是:
function sendAndReceive(messageToSend, port) {
port.write(messageToSend);
const response = port.readLine(); // BLOCKING, PERHAPS WITH TIMEOUT EXCEPTION;
return response;
}
for (const m of [serialMessage, batteryMessage]) {
console.log('Tx', m.trim());
const response = sendAndReceive(m);
console.log(response);
}
我在npm上寻找了一些“readliney”包(node-byline
,linebyline
,以及本机的readline
模块),但它们似乎都依赖于stream.on
事件,而这不是我想要的(serialport readline解析器已经做到了这一点)
是否有任何与流api兼容的函数允许我执行此操作?看起来您可以轮询
SerialPort.read()
来实现。下面是一些未经测试的伪代码:
函数发送和接收(messageToSend,端口){
port.write(messageToSend);
让反应='';
while(true){
response=port.read();//阻塞,可能有超时异常;
if(响应!=null){
打破
}
睡眠(1000);
}
返回响应;
}
功能睡眠(ms){
返回新承诺(解决=>{
设置超时(解析,毫秒)
})
}
受此启发: