在while循环内部不产生直接结果的asynchronous函数

我是nodejs的新手,我所做的是将LCD面板和4×4薄膜matrix键盘连接到Raspberry Pi,并使用Node.js对它们进行编程。 我想要达到的是每按一次按键,它应该立即显示在液晶面板上,当我按#应该停止input。

为此,我使用了包装液晶屏https://www.npmjs.com/package/lcd和RPIO https://github.com/jperkin/node-rpio因为我必须不断检查用户input我已经把代码在while循环和里面input我已经写的打印语句,这就是问题的来临。 当我按下键盘上的一个键时,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(); }); 

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

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

所以你必须结束活动的操作,并给予事件循环控制,然后执行打印命令。 但同时,只要不按“#”键,就必须保证再次扫描按键matrix。

这里是一个例子:

 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); } }); }); 

代码没有testing,因为我没有raspi在这里。 它应该给你一个如何解决问题的想法。

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