0

私は、Web インターフェイス (node + socket.io + node- serialport ) を使用してデータをシリアル ポートに送信し、Arduino によって読み取られてピンを HIGH に設定し、 LED に電力を供給する小さなプロジェクトに取り組んでいます。 (後でロケット点火システムのモデルに変換します)。

私が以下に持っているものは機能しますが、信頼性を確保するために解決したい2つの基本的な問題が発生しました:

  • これを機能させるには、各ページの読み込み/シリアル接続の間に 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

私の理解によると、2番目の問題について、連続して印刷される理由は、シリアルポートでデータが利用可能かどうかを確認することです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);

  }
}
于 2013-10-19T21:12:50.697 に答える