异步函数在循环内部不会产生立即结果

Vik*_*dav 6 javascript node.js npm raspberry-pi

我是nodejs的新手,我所做的是将LCD面板和4x4膜矩阵键盘连接到Raspberry Pi,我使用Node.js对它们进行了编程.我想要实现的是每当按下一个键时,它应该立即显示在LCD面板上,当我按下#时它应该停止输入.

为此,我使用了包装液晶显示器https://www.npmjs.com/package/lcd和RPIO https://github.com/jperkin/node-rpio,因为我必须不断检查用户输入我已经把代码为了在while循环和内部输入,我编写了print语句,这就是问题的来源.当我按下键盘上的键时LCD面板不显示任何字符,但是当我按#时,程序退出并且所有字符都显示在LCD面板上.

我写的代码如下.

var rpio = require('rpio');
var Lcd = require('lcd'),//This is asynchronous function
    lcd = new Lcd({
        rs: 18,
        e: 23,
        data: [24, 17, 27, 22],
        cols: 8,
        rows: 2
    });
var matrix=[[1,2,3,'A'],
            [4,5,6,'B'],
            [7,8,9,'C'],
            ['*',0,'#','D']]
var row=[37,35,33,31];
var col=[29,23,40,38];
for (var i = 0; i < 4; i++) {
    rpio.open(col[i], rpio.OUTPUT, rpio.HIGH);
}
for (var i = 0; i < 4; i++) {
    rpio.open(row[i], rpio.INPUT, rpio.PULL_UP);
}
var code="";
var comeout=0;
lcd.on('ready', function() {
    lcd.setCursor(0, 0);
    //start of keypad code
    while(true){
        for (var j = 0; j < 4; j++) {
            rpio.write(col[j],rpio.LOW);
            for (var i = 0; i < 4; i++) {
                if(rpio.read(row[i])==0){
                    console.log(matrix[i][j]);
                    lcd.print(matrix[i][j]);
                    if(matrix[i][j]=='#'){
                        comeout=1;
                        break;
                    }
                    while(rpio.read(row[i])==0);
                }
            }
            if(comeout==1)
                break;
            else
                rpio.write(col[j],rpio.HIGH);
        }
        if(comeout==1)
            break;
    }
    //end of keypad code
});

// If ctrl+c is hit, free resources and exit.
process.on('SIGINT', function() {
    lcd.clear();
    lcd.close();
    process.exit();
});
Run Code Online (Sandbox Code Playgroud)

任何帮助将非常感激.谢谢.

Pet*_*fer 1

根据上面与@Thomas 的讨论,我建议您使用请求矩阵并执行 LCD.print 的调用while(true)来模拟循环。setImediate这是因为 LCD.print 将操作添加到 javascripts 事件队列中。但事件队列的操作会被阻塞,直到实际操作完成为止。只要您在while(true)循环中,它就永远不会完成。

因此,您必须结束活动操作并将控制权交给事件循环,然后由事件循环执行打印命令。但同时您必须确保只要不按“#”键,就会再次扫描按键矩阵。

这是一个例子:

lcd.on('ready', function() 
{
  lcd.setCursor(0, 0);
  setImediate(
  function scanMatrix()
  {
    for (var j = 0; j < 4; j++) 
    {
      rpio.write(col[j],rpio.LOW);
      for (var i = 0; i < 4; i++) 
      {
        if(rpio.read(row[i])==0)
        {
          console.log(matrix[i][j]);
          lcd.print(matrix[i][j]);
          if(matrix[i][j]!='#')
          {
            setImmediate(scanMatrix);
          }
          while(rpio.read(row[i])==0);
        }
      }
      rpio.write(col[j],rpio.HIGH);
    }
  });
});
Run Code Online (Sandbox Code Playgroud)

该代码没有经过测试,因为我这里没有raspi。它应该让您了解如何解决问题。

一个非常酷的;-) 解决方案是将微控制器(MSP430,...)添加到按键矩阵。MC 扫描矩阵并通过 SPI 或 I2C 将按键传输到 raspi。....好吧,好吧,好吧,别打败我;-)