为什么串行端口写不能用于for循环?

时间:2019-05-27 11:22:33

标签: node.js express for-loop serial-port

我正在构建RESTful API,用于通过Node.js与收银机进行串行端口通信。主要思想是,Web应用程序将发送包含命令的数组,其余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,串行端口和收银机。

0 个答案:

没有答案