我有一个与串行设备通信的服务器。如果我在代码中直接配置内联串口,它会按预期工作。但是,如果我通过函数传递配置来创建新的serialport对象,则解析器不起作用。
有效的代码:
// serial port initialization:
var serialport = require('serialport'), // include the serialport library
SerialPort = serialport.SerialPort, // make a local instance of serial
portName = process.argv[2], // get the port name from the command line
portConfig = {
baudrate : 9600,
databits : 8,
parity : 'none',
stopBits : 1,
buffersize : 4096,
parser : serialport.parsers.readline('\n')
};
console.log(portConfig);
// open the serial port:
var myPort = new SerialPort(portName, portConfig);
console.log(myPort);
不起作用的代码:
function SetSerialPortConfig(data) {
var portBundle = JSON.parse(data);
var serialport = require('serialport'), // include the serialport library
SerialPort = serialport.SerialPort,
portName = portBundle[1].portName,
portConfig = {
baudrate : portBundle[0].baudrate,
databits : portBundle[0].databits,
parity : portBundle[0].parity,
stopBits : portBundle[0].stopBits,
buffersize : portBundle[0].buffersize,
parser : serialport.parsers.readline('\n')
};
return new SerialPort(portName, portConfig);
}
传递给函数的数据对象(现在使用我们知道的参数进行硬编码):
function configureSerialPort(){
var portBundle = [{
baudrate: 9600,
databits: 8,
parity: 'none',
stopBits: 1,
buffersize: 4096,
},
{
portName: 'com21'
}];
socket.send(JSON.stringify(portBundle));
}
使用网站上的按钮输入来配置端口myPort
,该按钮通过套接字读取:
// this function runs if there's input from the client:
socket.on('message', function (data) {
console.log("Client request received.");
console.log("SerialSend: " + data);
//check to see if the port is configured, if not, run configuration
if (typeof myPort === 'undefined') {
myPort = SetSerialPortConfig(data);
//prevents a write to the port with configuration data.
return false;
}
myPort.write(data); // send the data to the serial device
});
我们需要网页能够传递任何配置变量集,因此我需要使函数方法有效。如果我在任何一种情况下执行console.log(myPort);
,端口看起来都是相同的,所以我看不出解析器无法正常工作的原因。我可以直观地看到数据是通过LED Tx& amp; Rx在RS-485转换器上亮起,所以我知道设备上的端口正在发送和接收数据,但解析器没有看到EOL字符(我想),所以它只是在等待。
答案 0 :(得分:0)
我遇到了类似的问题,对我来说,修复是对所有可能的整数类型使用parseInt()
,例如baudrate
和stopbits
。
portConfig = {
baudrate : parseInt(portBundle[0].baudrate),
databits : parseInt(portBundle[0].databits),
parity : portBundle[0].parity,
stopBits : parseInt(portBundle[0].stopBits),
buffersize : parseInt(portBundle[0].buffersize),