为什么需要在使用之间重置Arduino(Node.js + node-serialport + socket.io)

时间:2013-10-19 00:55:04

标签: node.js sockets serial-port arduino

我正在开发一个小项目,我正在使用Web界面(节点+ socket.io + node-serialport)将数据发送到串行端口,然后由Arduino读取以设置一个引脚HIGH,为一个LED供电(我后来将其转换为模型火箭点火系统)。

我下面的内容有效,但我遇到了两个基本问题,我想解决以确保可靠性:

  • 为什么我必须在每个页面加载/串行连接之间重置Arduino才能使其正常工作?
  • 为什么当我不限制草图循环执行的次数(通过x)时,它会不断地将数据打印到串口,即使我只发送了一个字符?

草图

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

1 个答案:

答案 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);

  }
}