我正在开发一个小项目,我正在使用Web界面(节点+ socket.io + node-serialport)将数据发送到串行端口,然后由Arduino读取以设置一个引脚HIGH,为一个LED供电(我后来将其转换为模型火箭点火系统)。
我下面的内容有效,但我遇到了两个基本问题,我想解决以确保可靠性:
草图
int led = 8;
int x = 0;
void setup() {
pinMode(led, OUTPUT);
Serial.begin(9600);
}
void loop() {
if(x < 1) {
if(Serial.available() > 0) {
Serial.print(1);
digitalWrite(led, HIGH);
delay(5000);
digitalWrite(led, LOW);
x++;
}
}
}
app.js (简称简称)
socket.on('launch', function(data) {
for(var i = 5; i > 0; i--) {
socket.emit('countdown', { count: i });
if(i !== 1) {
sleep(1);
}
}
serialPort = new SerialPort("/dev/tty.usbserial-A6004amR", {
baudrate: 9600
});
serialPort.on('open', function (err) {
console.log('port opened... Press reset on the Arduino.');
serialPort.on('close', function (err) {
console.log('port closed');
});
serialPort.on('error', function (err) {
console.log('error: ' + err);
});
serialPort.on('data', function(data) {
// keeps getting 'data' events when x doesn't limit the loop
console.log('data received: ' + data);
});
serialPort.write(2, function(err, result) {
console.log('sent ' + result + ' chars.');
});
});
答案 0 :(得分:1)
根据我的理解,对于第二个问题,它连续打印的原因是您通过Serial.available()
检查串行端口上是否有任何数据可用,但由于您没有读取数据,因此数据在您下次发表声明时仍然可用。 Serial.read()
函数可用于读取可用数据并将其从串行缓冲区中删除。现在,为了缓解连续打印的问题,您已经引入了变量x
,这是您第一个问题背后的根本原因。一旦x
的值递增,在您执行arduino的硬件级别重置之前,它不会重置为0。那么请你试试下面的草图,让我知道它是否有效?感谢。
int led = 8;
void setup() {
pinMode(led, OUTPUT);
Serial.begin(9600);
}
void loop() {
if(Serial.available() > 0) {
Serial.read(); //-> if you comment this line out, you can see continuously printing.
Serial.print(1);
digitalWrite(led, HIGH);
delay(5000);
digitalWrite(led, LOW);
}
}