0

我正在做一个小项目,我使用 Web 界面(node + socket.io + node-serialport)将数据发送到串行端口,然后由 Arduino 读取以将引脚设置为高电平,为 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.');
    });
  });
4

1 回答 1

1

根据我的理解,对于第二个问题,它连续打印的原因是您检查串行端口上是否有任何数据可用,Serial.available()但由于您没有读取数据,因此下次访问时数据仍然可用陈述。可以使用一个Serial.read()函数来读取可用数据并将其从串行缓冲区中删除。现在,为了缓解连续打印的问题,您引入了变量x,这是您的第一个问题背后的根本原因。一旦值x增加,它不会重置为 0,直到您对 arduino 进行硬件级别重置。所以你能试试下面的草图,让我知道它是否有效吗?谢谢。

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

  }
}
于 2013-10-19T21:12:50.697 回答