使用nodejs与arduino进行串行通信

时间:2015-10-09 05:32:01

标签: javascript node.js arduino serial-port

我试图使用nodejs来控制arduino。我的问题是我试图给arduino写一个interger但是值不会注册。可以帮助吗?

node.js串行通信代码:

var serialport = require("serialport");
var SerialPort = serialport.SerialPort;

var serialPort = new SerialPort("/dev/cu.usbmodem14131", {
  baudrate: 9600,
  parser: serialport.parsers.readline("\n")
});

serialPort.on("open", function () {
  console.log('open');
  serialPort.write("45/r/n")            // wrinting offset value to the arduino 
  serialPort.on('data', function(data) {
    console.log(data);
  });
});

这里是arduino代码"

 #include <Wire.h>

int offset = 0; 
String inString = "";

void setup()
{
  Serial.begin(9600);
  delay(100);
}

void loop(){

  Serial.println(offset); //printing the offset 

  while (Serial.available() > 0) {
    int inChar = Serial.read();
      // convert the incoming byte to a char
      // and add it to the string:
      inString += (char)inChar;

    // if you get a newline, print the string,
    // then the string's value:
    if (inChar == '\n') {
      Serial.print("Offset:");
      Serial.println(inString.toInt());
      offset = inString.toInt();
      // clear the string for new input:
      inString = "";
    }
  }
delay(1000);  

}

我不确定我是以错误的方式写错误还是接收错误,但如果我在arduino IDE中手动输入值,则arduino代码可以正常工作。

谢谢。

1 个答案:

答案 0 :(得分:0)

我不确定你的nodejs代码,但我认为arduino例程存在问题。我注意到你的nodejs例程正在发送/ r / n而Arduino例程只是在寻找/ n。

你拥有的while循环可以在不到一个串行字符时间内完全执行,因此它可能会在字符之间增加1秒的延迟。

我会将它结构化以保持while循环,直到收到换行符。以下示例尚未编译,但阐述了该概念。它还会过滤掉&#39; / r&#39;字符。

int inChar;
void loop(){ 
    // clear the string for new input:
    inString ="";         
    inChar=0;

    while (inchar!= '\n') {
        while (Serial.available() > 0) { 
            inchar = Serial.read();
            // do you need to filter the '/r' for it to work correctly?
            if (inchar != '/r') {
                // convert the incoming byte to a char
                // and add it to the string:
                inString += (char)inChar;
            }
        }
    }

    // when you receive a newline, print the label and 
    // the string's value:        
    Serial.print("Offset:");
    Serial.println(inString.toInt());
    offset = inString.toInt();


    delay(1000);  
}