As I mentioned, there is a smell w.r.t. what you are doing. However, that aside, here is some code that you can try. I can't test it, but hopefully it will be of some help.
const SerialPort = require('serialport');
const port = new SerialPort(require('./ports').arduino, {
autoOpen: false,
baudRate: 115200,
dataBits: 8,
parity: 'none',
stopBits: 1,
parser: SerialPort.parsers.readline('\n')
});
let portSatus = 'init';
port.on('error', err => console.log('Error: ', err.message));
port.on('open', () => {
portSatus = 'open';
console.log('Port is open');
setTimeout(() => {
portSatus = 'ready';
console.log('Port is ready');
}, 500);
});
port.on('disconnect', () => {
portSatus = 'disconnected';
console.log('Port disconnected');
});
port.on('closed', () => {
portSatus = 'closed';
console.log('Port is closed');
});
port.open(err => {
if (err) {
console.log('Error opening port: ', err.message);
} else {
console.log('Opening port');
}
});
function dummyCallback(dataString) {
console.log('Data without callback: ', datastring);
}
function doCallBackOnData(callBack) {
port.on('data', dataString => {
console.log('Received data', dataString);
const data = JSON.parse(dataString);
data.timeStamp = Date.now();
callBack(data);
doCallBackOnData(dummyCallback);
});
}
doCallBackOnData(dummyCallback);
module.exports = callback => {
if (portSatus === 'ready') {
console.log('Calling command9');
port.write('9', err => {
if (err) {
console.log('command9 error: ', err.message);
callback(err.message);
} else {
console.log('command9 buffered');
port.drain(() => {
console.log('command9 written');
doCallBackOnData(callback);
});
}
});
} else {
console.log('Can not call command9:', portSatus);
callback(portSatus);
}
};