Я создаю RESTful API для связи через последовательный порт с кассовым аппаратом через Node.js. Основная идея заключается в том, что веб-приложение будет отправлять массив с командами, а остальные API (хранящиеся локально на машине с кассовым аппаратом) будут отправлять каждую команду в регистр по одному. После каждой команды последовательный порт (кассовый аппарат) должен отправлять обратно сообщение со статусом.
Моя проблема с функцией записи в порт.
Когда я отправляю массив с командами (в настоящее время их всего 5, но их может быть N), я пытаюсь отправить каждую команду в цикле for. Я установил таймаут, поэтому между каждой командой есть некоторый период ожидания. Проблема в том, что отправляется только первая (а иногда и вторая) команда.
Но если я вручную отправляю каждую команду, все работает как положено.
Закомментированная часть - это та, которую я пытаюсь заставить работать, а некомментированная - та, которая работает сейчас. Это не подходит, так как оно жестко закодировано.
app.post('/write', function (req, res) {
var commands = req.body.cmd;
if(commands === '') res.json({error: '450'});
var cmdLength = commands.length;
/* for (let i = 0; i < commands.length; i++){
setTimeout(() => {
sendCmd(commands[i]);
console.log(commands[i]);
readData();
if(i == cmdLength){
setTimeout(() => {
res.json({fp : receivedData});
}, 750)
}
}, 750)
// timeout(commands[i]);
}*/
if (commands instanceof Array){
console.log('in if');
sendCmd(commands[0]);
readData();
setTimeout(() => {
sendCmd(commands[1]);
readData();
setTimeout(() => {
sendCmd(commands[2]);
readData();
setTimeout(() => {
sendCmd(commands[3]);
readData();
setTimeout(() => {
sendCmd(commands[4]);
readData();
setTimeout(() => {
res.json({fp: receivedData});
}, 750)
}, 750)
}, 750)
}, 500)
}, 500)
}else{
sendCmd(commands);
readData();
setTimeout(() => {
res.json({fp: '200'});
}, 500)
}
serialPort.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
});
});
function sendCmd(cmd){
serialPort.write(cmd);
}
function readData(){
receivedData = '';
serialPort.on('data', function (data) {
console.log(data);
receivedData += data.toString('hex');
})
}
Очевидно, что ручной метод нежелателен, и было бы идеально, если бы кто-то мог указать мне на проблему. Я думаю, что это что-то с попыткой записи, в то время как предыдущий не закончен (поэтому есть тайм-ауты), но я не уверен, так как я впервые работаю с nodejs, последовательными портами и кассовыми аппаратами.