我们遇到了一个问题,我们从节点服务器发送多个响应,通过套接字服务器(socket.io)连接到Web客户端。通过使用Docklight进行监听,我可以看到我们实际上只是从串行设备获得单个响应,但由于某种原因,节点服务器正在发送多个,并且它们会累积,因此第一次发送串行命令时(并不重要的是什么命令)可能只会得到一对,下次再多一次,下次再多几次等等。因此,如果您运行多个串行命令,您将获得大量多个响应。
我们的环境是Windows 7 64位,Node V 4.5.0,serialport V 4.0.1。但是,这需要在Windows,Mac和Mac上运行。 Linux,当我们完成。开发团队(我和另外一个人)对Node来说都是相当新的,但是其他有能力的开发人员。
我认为发生的事情是我没有使用.flush()
& .drain()
正常运行,串口缓冲区仍包含串行数据。我们的专有设备在命令完成时返回S>
或<Executed/>
提示,因此我将串行响应存储在缓冲区中,直到我看到其中一个,然后处理数据(在此示例中仅提供布尔响应,无论设备是否响应其中一个或另一个)。例如,如果我向其中一个设备发送<CR><LF>
,则应该S>
(或<Executed/>
取决于)。
客户端使用以下命令调用服务器:
socket.on('getDeviceConnected', readDeviceResponse);
function readDeviceResponse(isDeviceResponding) {
console.log('getDeviceConnected');
console.log(isDeviceResponding);
}
function getDeviceConnected() {
console.log("Sending carriage return / line feed.");
socket.emit('getDeviceConnected', '\r\n');
}
在服务器上,我正在尝试:
socket.on('getDeviceConnected', function (connectionData) {
//write over serial buffer before the write occurs to prevent command accumulation in the buffer.
serialBuffer = '';
sbeSerialPort.write(connectionData, function (err, results) {
//since there's no way to tell if the serial device hasn't responded, set a time out to return a false after allowing one second to elapse
setTimeout(function () {
console.log('Inside getDeviceConnected setTimeout');
console.log('Is serial device responding:', isSerialDeviceResponding);
if (!isSerialDeviceResponding) {
console.log('Serial device timed out.');
socket.emit('getDeviceConnected', false);
}
}, 1000);
if (err) {
console.log('Serial port error level:', err);
}
if (results) {
if (results === 2) {
console.log('Serial port is responding');
}
}
});
sbeSerialPort.on('data', function (serialData) {
isSerialDeviceResponding = true;
console.log('Does S> prompt exist?', serialData.lastIndexOf('S>'));
while(!serialData.lastIndexOf('S>') > -1 || !serialData.lastIndexOf('<Executed/>') > -1){
serialBuffer += serialData;
break;
}
if (isSerialDeviceResponding) {
socket.emit('getDeviceConnected', true);
isSerialDeviceResponding = true;
}
sbeSerialPort.flush(function (err, results) {
if (err) {
console.log(err);
return;
}
if(results){
console.log('Serial port flush return code:', results);
}
});
});
我对此处的.flush()
实施情况不太确定,而且我省略了.drain()
部分,因为它们似乎都没有做任何事情(假设它们是正确的)实现)。
当.write()
命令完成时,如何确保串行端口缓冲区中没有数据?或者您是否看到了我处理串行数据的其他问题?
在pastebin.com上编辑,源代码: