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

为什么在使用(Node.js+;Node serialport+;socket.io)之间需要重置Arduino,node.js,sockets,serial-port,arduino,Node.js,Sockets,Serial Port,Arduino,我正在做一个小项目,在这个项目中,我使用一个web界面(node++)将数据发送到一个串行端口,然后由Arduino读取该端口以设置一个高引脚,为一个led供电(稍后我会将其转换为火箭点火系统模型) 我下面的方法很有效,但为了确保可靠性,我想解决两个基本问题: 为什么我必须在每个页面加载/串行连接之间重置Arduino才能正常工作 为什么当我不限制草图循环的执行次数(通过x)时,即使我只发送了一个字符,它也会连续地将数据打印到串行端口 草图 int led = 8; int x = 0;

我正在做一个小项目,在这个项目中,我使用一个web界面(node++)将数据发送到一个串行端口,然后由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++;
    }
  }
}

根据我的理解,对于第二个问题,它连续打印的原因是您通过
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);

  }
}

这不会造成一个无休止的循环吗?您正在读取是否有数据,然后打印1,这将导致循环再次执行,因为缓冲器中有数据(1)。否。插脚RX用于从主机接收数据,插脚TX用于传输数据。因此,读取/可用查看RX引脚,而打印写入TX引脚。
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);

  }
}