gpt4 book ai didi

javascript - 异步函数在 while 循环中不立即产生结果

转载 作者:数据小太阳 更新时间:2023-10-29 05:35:08 25 4
gpt4 key购买 nike

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

为此我使用了软件包 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();
});

任何帮助将不胜感激。谢谢。

最佳答案

根据上面与@Thomas 的讨论,我建议您使用 setImediate 调用来模拟 while(true) 循环,在其中请求矩阵并执行 LCD 。打印。这是因为 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);
}
});
});

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

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

关于javascript - 异步函数在 while 循环中不立即产生结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41529688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com