Почему запись по последовательному порту не работает для цикла? - PullRequest
0 голосов
/ 27 мая 2019

Я создаю 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, последовательными портами и кассовыми аппаратами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...