我正在构建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,串行端口和收银机。